Less is More!

    科技2022-07-10  186

    Java学习

    编译文件

    java文件先通过javac Hello.java编译成字节码文件,会生成一个class文件

    然后再java Hello (注意不用加class ,java 本身就是编译class)

    快捷代码

    psvm publicstatic void main

    sout System.out.println

    ctrl+D复制当前行到下一行

    100.for for (int i = 0; i < 100; i++) { }

    alt+ins 生成构造器

    ctrl + alt + t 快速生成捕获异常

    变量

    变量:可以变化的量

    数据类型 + 变量名 = 值

    String a = “15”; a就叫变量

    所有变量必须先定义后使用0

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N57i0if5-1601693619273)(C:\Users\13778\Desktop\图片\1.png)]

    局部变量:在方法里定义,生命周期就在一个大括号里

    public static void main(String[] args) { //局部变量:必须声明和初始化值 int i = 10; System.out.println(i); }

    实例变量:类和方法之间定义 从属于对象 ,如果不进行初始化,基本类型默认值为0

    public class Demo04 { //实例变量:从属于对象 如果不进行初始化,默认值为0 // 除了基本类型,其余默认值为null // 布尔值默认是false String name; int age; public static void main(String[] args) { Demo04 st1 = new Demo04(); System.out.println(st1.name); System.out.println(st1.age); // st1.name="董泽超"; //st1.age=18; }

    类变量:在类和方法之间用static定义 可以直接调用

    public class Demo04 { //类变量 static static double salary = 2500; public static void main(String[] args) { System.out.println(salary); }

    变量命名规范

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eeAW6gge-1601693619274)(C:\Users\13778\Desktop\图片\2.png)]

    常量

    常量:初始化之后就不能变动

    final 常量名 = 值

    数据类型

    数据类型分为基本类型和引用类型

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C8HQXN6P-1601693619276)(C:\Users\13778\Desktop\图片\3.png)]

    引用类型:类 接口 数组

    数据类型拓展

    public class Demo01 { public static void main(String[] args) { //整数拓展: 进制 二进制0b 八进制 十进制0 十六进制0x int i = 10; int i2 = 010;//八进制0 int i3 = 0x10;//十六进制0x 0~9 A~F F=16 System.out.println(i); System.out.println(i2); System.out.println(i3); System.out.println("---------------------------"); //浮点数拓展 //银行业务怎么表示 BigDecimal数学工具类 //float 有限 离散 有舍入误差 接近但不等于 //double //最好完全使用浮点数进行比较 //最好完全使用浮点数进行比较 //最好完全使用浮点数进行比较 float f = 0.1f;//0.1 double d = 1.0/10.0;//0.1 System.out.println(f); System.out.println(d); System.out.println(f==d);//false float f1 = 233222322112213f; float f2 = f1+1; System.out.println(f1==f2);//true System.out.println("---------------------------"); //字符拓展 所有的字符本质还是数字 //编码 Unicode 2字节 65536 char c1 = 'a'; char c2 = '国'; System.out.println(c1); System.out.println((int)c1);//强制转换int System.out.println(c2); System.out.println((int)c2); //U0000~UFFFF char c3 = '\u0061'; System.out.println(c3); System.out.println("---------------------------"); //转义字符 // \t制表符加空 \n换行 System.out.println("Hello\tWorld"); System.out.println("Hello\nWorld"); String sa = new String("HelloWorld"); String sb = new String("HelloWorld"); System.out.println(sa==sb); String sc = "HelloWorld"; String sd = "HelloWorld"; System.out.println(sc==sd); //对象 从内存分析 System.out.println("---------------------------"); //布尔值扩展 boolean flag = true; if(flag==true){ }//小白 if(flag){ }//大牛 //默认为真 Less is More! } }

    数据转换

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rXVWVFQo-1601693619277)(C:\Users\13778\Desktop\图片\4.png)]

    强制转换 (类型)变量名 高–低 自动转换 低–高

    public class Demo02 { public static void main(String[] args) { //不同数据类型的数据先转化为同一类型,再运算 int i = 128; byte b = (byte)i;//内存溢出 double d = i; //强制转换 (类型)变量名 高容量--低容量 //自动转换 低--高 System.out.println(i); System.out.println(b); /* 1.不能对布尔值进行转换 2.不能把对象类型转换为不相干的类型 3.在把高容量转换成低容量时,强制转换 4.转换时候可能存在内存溢出,或者精度问题 */ System.out.println((int)23.7);//23 System.out.println((int)-45.5f);//-45 char c = 'a'; int c1 = c+1; System.out.println(c1); System.out.println((char)c1); //操作较大的数时,注意溢出问题 int money = 1000000000; int years = 20; int total = money*years; long total2 = money*years; System.out.println(total);//-1474836480 计算溢出 System.out.println(total2);//默认是int 转换前就存在问题了 long total3 = money*(long)years;//先把一个数转换成long System.out.println(total3); } }

    运算符

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rvyYXtAj-1601693619278)(C:\Users\13778\Desktop\图片\5.png)]

    运算有数为long时,结果为long,有double时,结果为double

    其他结果为int

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iCIxbki9-1601693619279)(C:\Users\13778\Desktop\图片\6.png)]

    关系运算符的结果:正确或者错误 布尔值

    与(and) 或(or) 非(取反)

    与:一假则假

    或:一真则真

    非:真变假,假变真

    //与(and) 或(or) 非(取反) boolean a = true; boolean b = false; System.out.println("a && b"+(a && b));//与:一假则假 System.out.println("a || b"+(a || b));//或:一真则真 System.out.println("!(a && b)"+(!(a && b)));//非:真变假,假变真

    自加自减运算

    a++ 先将a赋值给b,再+1

    ++a 先+1,再赋值给c

    //++ -- 自增自减 一元运算符 int a = 3; int b = a++; //a++ 先将a赋值给b,再+1 System.out.println(a); int c = ++a;//++a 先+1,再赋值给c System.out.println(a); System.out.println(b); System.out.println(c);

    结果为 4 5 3 5

    短路运算

    int c = 5; boolean d = (c<4)&&(c++<4); System.out.println(d); System.out.println(c);

    与运算,先判断前面的条件,如果为假,不运行后面的条件了

    d为false c为5

    位运算

    A = 0011 1100 B = 0000 1101 A&B= 0000 1100 只有都为1时才为1,其余为0 A|B= 0011 1101 只有都为0时才为0,其余为1 A^B= 0011 0001 相同为0,不同为1 ~B = 1111 0010 取反 效率极高 << *2 >> /2 0000 0000 0 0000 0001 1 0000 0010 2 0000 0011 3 0000 0100 4 0000 1000 8 0001 0000 16

    2<<3 结果为16

    int a = 10; int b = 20; //字符串连接符 + , String System.out.println(""+a+b); //1020 System.out.println(a+b+""); //30 //字符串在前面才不会加在一起 //三元运算符 //x?y:z 如果x==true,则结果为y,否则为z int score = 80; String type = score<60?"不及格":"及格"; 输出及格

    Doc包

    cmd中路径下 javadoc -encoding UTF-8 -charset UTF-8 Doc.javaIDEA生成javadoc文档

    Scanner

    //创建一个扫描器对象,用于接收键盘输入的数据 Scanner a = new Scanner(System.in); int i = 0; float f = 0.0f; System.out.println("请输入数据"); //判断用户用没有输入字符串 if(a.hasNextInt()){ i = a.nextInt(); System.out.println(i); }else{ System.out.println("你输入的不是整数"); } System.out.println("你输入的整数"); if(a.hasNextFloat()){ f = a.nextFloat(); System.out.println(f); }else{ System.out.println("你输入的不是小数"); } //凡是IO流的类要及时关闭,避免占用资源 a.close();

    循环

    break用于强行退出循环

    continue用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下次是否执行循环的判定

    方法

    修饰符 返回值类型 方法名 (参数类型 参数名称){

    ​ 方法体

    ​ return 返回值;

    }

    形参 方法定义时的参数

    实参 实际调用传递的参数

    返回值类型为void就不用return了

    //非静态方法 public void say(){ System.out.println("hello"); } //静态方法 可以直接调用 public static void said(){ System.out.println("word"); }

    方法的重载

    方法名一样, 参数类型不同

    命令行传参

    public class Demo03 { public static void main(String[] args) { //命令行传参 for(int i =0;i< args.length;i++){ System.out.println("args["+i+"]:"+args[i]); } } }

    编译class文件后要退到src目录

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qgJiLLdF-1601693619280)(C:\Users\13778\Desktop\图片\image-20200821101553404.png)]

    可变参数

    public void text(int x, int... i) { System.out.println(x); System.out.println(i[0]); System.out.println(i[1]); System.out.println(i[2]); System.out.println(i[3]); }

    可以赋予多个值,只能位于形参尾

    数组

    int[] num1;//两种方式都可以,这种首选 int num2[];//这种方式主要是方便c++转变成java public static void main(String[] args) { int[] nums;//1.定义一个数组 nums = new int[10];//2.创建一个数组,这里面可以存放10个int类型的数字 //前两步也可以这样写 int[] xiao = new int[10]; //3.给数组元素赋值 nums[0] = 1; nums[1] = 2; nums[2] = 3; nums[3] = 4; nums[4] = 5; nums[5] = 6; nums[6] = 7; nums[7] = 8; nums[8] = 9; nums[9] = 10; //计算所有元素的和 int sum = 0; for (int i = 0;i<nums.length;i++){ sum = sum + nums[i]; } System.out.println(sum); }

    声明数组是放入栈中,创建数组是放入堆中

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lX2NvDuI-1601693619281)(C:\Users\13778\Desktop\图片\image-20200825164728689.png)]

    ArrayIndexOutOfBoundsException 数组下标越界异常

    int[] a = {1,2,3,85,2,14,478,3}; Arrays.sort(a);//数组排序 System.out.println(Arrays.toString(a));//输出数组

    多维数组

    public static void main(String[] args) { int[][] b = {{1,2},{2,3},{3,4}};//3行2列的数组 for (int i = 0 ;i<b.length;i++){ for (int j= 0 ;j<b[i].length;j++){ System.out.println(b[i][j]); } } }

    冒泡排序

    public static void main(String[] args) { //冒泡排序 int[] a = {12,542,5,545,54,54,5,69,87}; int[] b = sort(a); System.out.println(Arrays.toString(b)); } public static int[] sort(int[] a){ int c=0; //外层循环,判断走了几趟 for (int i = 0;i<a.length-1;i++){ boolean flag = false;//减少没有意义的比较 //内层循环 for (int j = 0 ; j<a.length-1-i;j++){ if(a[j]<a[j+1]){ c = a[j]; a[j] = a[j+1]; a[j+1] = c; flag=true; } if(flag=false){ break; } } } return a; }

    稀疏数组

    public static void main(String[] args) { //创建11 X 11 的二维数组 int[][] a = new int[11][11]; a[1][2] = 1; a[2][3] = 2; for (int[] ints:a) { for (int anInt:ints){ System.out.print(anInt+"\t"); } System.out.println(); } //获取有效个数 int sum = 0; for (int i = 0;i<a.length;i++){ for(int j= 0;j<a[i].length;j++){ if (a[i][j]!=0) { sum=sum+1; } } } System.out.println(sum); //创建稀疏数组 int[][] b = new int[sum+1][3]; b[0][0] = 11; b[0][1] = 11; b[0][2] = sum; //赋值 int count = 0; for (int i = 0;i<a.length;i++){ for(int j= 0;j<a[i].length;j++){ if (a[i][j]!=0) { count=count+1; b[count][0]=i; b[count][1]=j; b[count][2]=a[i][j]; } } } //打印 for (int i = 0;i<b.length;i++){ System.out.println(b[i][0]+"\t"+b[i][1]+"\t"+b[i][2]); } System.out.println("还原"); //创建还原数组 int[][] c = new int[b[0][0]][b[0][1]]; //赋值 for (int i= 1;i<b.length;i++){ c[b[i][0]][b[i][1]] = b[i][2]; } //打印 for (int[] ints:a) { for (int anInt:ints){ System.out.print(anInt+"\t"); } System.out.println(); } }

    面向对象

    以类的方式组织代码,以对象的组织(封装)数据

    //类实例化之后才存在 public void a(){ b(); } //static 和类一起加载的 public static void b(){ } public class Student { public static void main(String[] args) { Student a = new Student(); a.say(); } //非静态方法 public void say(){ System.out.println("hello"); } //静态方法 可以直接调用 public static void said(){ System.out.println("word"); } }

    值传递

    //值传递 public class Demo02 { public static void main(String[] args) { int a =1;//1 System.out.println(a);//1 Demo02.a(a); System.out.println(a); } //返回值为零 public static void a(int a){ a = 10; } }

    引用传递

    //引用传递:对象 本质还是值传递 public class Demo03 { public static void main(String[] args) { Person a = new Person(); System.out.println(a.name); Demo03.change(a); System.out.println(a); } public static void change(Person a){ a.name = "泽超"; } //定义了一个Person类,有一个name属性 } class Person{ String name; }

    构造器

    1.和类名相同

    2.没有返回值

    作用:

    1.new 本质在调用构造方法

    2.初始化对象的值

    public class People { String name; //实例化初始值 //1.使用new,必须有构造器 //2.初始化值 public People() { this.name = "超"; } public People(String name) { this.name = name; } } ublic class Demo04 { public static void main(String[] args) { People a = new People("zc"); System.out.println(a.name); } }

    小结

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZQO6G0Vk-1601693619282)(C:\Users\13778\Desktop\图片\image-20200901114052081.png)]

    封装

    get 获取这个数据

    set 给这个数据设置值

    public class Student { private String name;//姓名 private int age; private char sex; //get 获取这个数据 //set 给这个数据设置值 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { if (age > 120 || age < 0) { this.age = 3; } else { this.age = age; } } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } /* public static void main(String[] args) { Person a = new Person(); }} public class Demo01 { public static void main(String[] args) { Student chao = new Student(); chao.setName("超"); System.out.println(chao.getName()); chao.setAge(10); System.out.println(chao.getAge()); chao.setSex('男'); System.out.println(chao.getSex()); } }

    继承

    所有的类,都默认直接或者间接继承Object

    子类继承了父类,就会拥有父类全部的方法

    一个儿子只能与一个爸爸,一个爸爸能有多个儿子

    private无法被继承

    super

    1.super调用父类的构造方法,必须在构造方法的第一行

    2.super必须只能出现在子类的方法或者构造方法中

    3.super和this不能同时调用构造方法

    对比this:

    ​ this:本身调用这个对象,没继承也能使用,本类的构造

    ​ super:代表父类对象的应用,只能在继承条件下才可以使用,父类的构造

    重写

    需要有继承关系,子类重写父类的方法

    1.方法名相同

    2.参数列表相同

    3.修饰符 范围可以扩大 public>Protected>Default>private

    4.抛出异常范围可以被缩小,不能被扩大 ClassNotFoundException -->Exception(大)

    为什么需要重写:

    1.父类的功能,子类不一定需要,不一定满足

    Alt+Insert :Override

    public class B { public void test(){ System.out.println("B=>test"); } } public class A extends B { //Override重写 @Override//注解:有功能的注释 public void test() { System.out.println("A"); } } A a = new A(); a.test();//A B b = new A();//子类重写父类的方法 b.test();//A

    不能重写的:

    1.static 方法属于类,不属于实例

    2.final 常量

    3.private 方法

    多态

    1.多态是方法的多态,属性没有多态

    2.父类和子类有联系 类型转换异常 ClassCastException

    3.存在条件:继承关系,方法需要重写 父类引用指向子类 father f1 = new Son();

    instanceof

    System.out.println(x instanceof y); 判断x是不是y的子类型从而编译通过

    类型转换

    两种方法 ((Student) s1).go(); Student s11 = (Student) s1; s11.go();

    子类转换为父类,可能丢失自己本来的一些方法

    1.父类引用指向子类的对象

    2.把子类转换为父类,向上转换

    3.把父类转换为子类,向下转换,强制转换

    4.方便方法调用,减少重复的代码

    static

    //静态导入包 import static java.lang.Math.random; import static java.lang.Math.PI; public class Test { public static void main(String[] args) { System.out.println(random()); System.out.println(PI); } }

    抽象类

    //abstract 抽象类 public abstract class Action { //约束 有人帮我们实现 //abstract 抽象方法,只有方法名字,没有方法的实现 public abstract void dosomething(); //1.不能new这个抽象类,只能靠子类去实现它 约束 //2.抽象类可以写普通方法,抽象方法必须在抽象类里 } //抽象类的所有方法,继承了它的子类,都必须实现他的方法 除非子类也是抽象类,就让子子类去实现 public class A extends Action{ @Override public void dosomething() { } }

    接口

    作用:

    1.约束

    2.定义一些方法,让不同的的实现

    3.默认方法都是public abstract

    4.常量都是public static final

    5.接口不能被实例化 接口中没有构造方法

    6.implements可以实现多个接口

    7.必须重写接口中的方法

    //interface 定义关键字 接口都需要有实现类 public interface UserService { //常量public static final int age = 99; //接口中的所有定义的方法都是抽象的 默认都是public abstract void add(String name); void delete(String name); void update(String name); void query(String name); } public interface TimeService { void time(); } //implements 实现接口 //实现了接口的类,必须重写接口的方法 //利用接口实现多继承 public class UserServiceImpl implements UserService,TimeService{ @Override public void add(String name) { } @Override public void delete(String name) { } @Override public void update(String name) { } @Override public void query(String name) { } @Override public void time() { } }

    内部类

    public class Outer { } //一个java文件里只能由一个public class 不过可以有多个class class A{ public static void main(String[] args) { } }

    成员内部类

    public class Outer { private int id = 10; public void out(){ System.out.println("这是外部类的方法"); } public class Inner{ public void in(){ System.out.println("这是内部类的方法"); } //获得外部类的私有属性 public void getID(){ System.out.println(id); } }}

    静态内部类

    public class Outer { public void out(){ System.out.println("这是外部类的方法"); } public static class Inner{ public void in(){ System.out.println("这是内部类的方法"); } //获得外部类的私有属性 }}

    局部内部类

    public class Outer { //局部内部类 public void method(){ class Inner{ public void in(){ } } } }

    匿名内部类

    可以操作外部类的私有属性

    异常

    ctrl + alt +t

    public class Demo01 { public static void main(String[] args) { try { new Demo01().test(1,0); } catch (ArithmeticException e) { e.printStackTrace(); } finally { } } //throws 用于方法上 //throw 用于方法中 public void test(int a ,int b)throws ArithmeticException{ if(b==0){ throw new ArithmeticException(); } } } /* int a = 10; int b = 0; try { System.out.println(a/b); } catch (Exception e) { e.printStackTrace();//打印错误的栈信息 } finally { }*/ /* try{//try检测区域 System.out.println(a/b); }catch(ArithmeticException e ){//捕获异常 System.out.println("异常"); }finally {//处理善后工作 System.out.println("finally"); } //finally 可以不要 用于资源关闭 //假设要捕获多个异常,从小到大捕获 try{ new Demo01().a(); }catch(Error e){ System.out.println("Error"); }catch(Exception e){ System.out.println("Exception"); }catch(Throwable e ){//catch(想要捕获的异常类型) System.out.println("Throwable"); }finally{ System.out.println("finally"); } } public void a(){ b(); } public void b(){ a(); */

    自定义异常

    //自定义异常类 public class Demo02 extends Exception{ //传递数字10 private int detail; public Demo02(int a ){ this.detail = a; } //toString 打印异常信息 @Override public String toString() { return "Demo02{" + detail + '}'; } } public class Test { //可能会存在异常的方法 static void test(int a) throws Demo02 { System.out.println("传递的参数为"+a); if(a>10){ throw new Demo02(a); } System.out.println("ok"); } public static void main(String[] args) { try { test(11); } catch (Demo02 e) { System.out.println("异常为"+e); } } }

    英语

    cast 转换

    salary 工资

    param 参数

    struct 结构

    operator 符号

    }catch(Exception e){ System.out.println("Exception"); }catch(Throwable e ){//catch(想要捕获的异常类型) System.out.println("Throwable"); }finally{ System.out.println("finally"); } } public void a(){ b(); } public void b(){ a(); */ ### 自定义异常 ```java //自定义异常类 public class Demo02 extends Exception{ //传递数字10 private int detail; public Demo02(int a ){ this.detail = a; } //toString 打印异常信息 @Override public String toString() { return "Demo02{" + detail + '}'; } } public class Test { //可能会存在异常的方法 static void test(int a) throws Demo02 { System.out.println("传递的参数为"+a); if(a>10){ throw new Demo02(a); } System.out.println("ok"); } public static void main(String[] args) { try { test(11); } catch (Demo02 e) { System.out.println("异常为"+e); } } }

    英语

    cast 转换

    salary 工资

    param 参数

    struct 结构

    operator 符号

    array 数组

    Processed: 0.106, SQL: 8