1.源程序通过javac xxx.java编译生成xxx.class字节码文件,然后通过java xxx运行
2.dir 查看目录,cls清屏
3.小的到大的范围为隐式类型转换,大的到小的需要进行显式(强制)类型转换 ,在赋值时候加上(变量类型) 有一种常量优化,常数直接相加,不是变量,大的变小的时候不用加强制类型转换
4.Java9中新增了jshell 可以不用写类和方法直接运行,比较轻量化,退出用/exit
5.&&和||为短路运算符,只要左边不满足,右边就不进行操作 比如system.out.println(3>4 && a++)因为左边直接是false 右边不会执行
6.switch-case中的变量只能是byte,short ,int ,char ,string和enum
7.for循环简写,5.for i
8.方法中局部变量在栈中,new出来的都在堆中
9.方法重载(overload),1:参数个数不同,2:参数类型不同,3:参数类型顺序不同。
而返回值类型和参数名称不同是不构成重载的
10.成员变量有默认值,局部变量没有默认值。
局部变量在栈中,成员变量在堆中
11.泛型必须是引用类型,不能是基本数据类型,int需要变为Integer,char变为Character;
ArrayList是最简单的列表,相对于对象数组而言,长度可变。方法有:
①.size()获取长度,
②.get()获取某位置元素,
③.remove()移除某位置,
④.add()增加。
12.字符串的内容永不可变,可以共享使用
13.程序中直接写上双引号的字符串在字符串常量池中,字符串常量池在堆中,new出来的话不在字符串常量池中
14.String的三种创建方式:①String str = new String(char[] charArray);
②String str = new String(byte[] byteArray)
③String str = new String();(空字符串)
一种直接方式:String str = “HelloWorld”;
15.String的几种方法。①使用str1.equals(str2)来比较字符串内容是否相同
②使用str1.equalsIgnoreCase(str2)比较字符串内容忽略大小写
③str.length()输出字符串的长度
④str1.concat(str2)连接两个字符串,返回一个新的字符串
⑤str.charAt(num)返回下标num处的字符
⑥str1.indexOf(str2)返回str1中首次出现str2的下标,没有返回-1
⑦str1.substring(num) 里面的是一个num表示从num开始刀最后。两个num表示截取的范围,返回的是选取范围的字符串(String)
⑧str1.toCharArray() 将当前字符串转换为字符数组,返回类型是字符数组
⑨str.getBytes()将当前字符串转换为底层的byte数组
⑩str.replace(old,new)把字符串中的old字符全部转换为new;str.split(","),以,为分隔符分隔字符串,返回的是一个字符串数组
16.一旦使用static修饰成员方法,那么就成了静态方法,静态方法不属于对象,而是属于类的。
静态方法不能调用非静态变量,因为在内存中【先】有静态内容【后】有非静态内容,先来的不能知道后来的东西,静态方法中不能使用this,直接使用类名。
17.当第一次用到本类时,静态代码块执行唯一的一次,静态内容总是优先于非静态,所以静态方法先于构造方法执行。
静态代码块的典型用途:用来一次性的对静态成员变量进行赋值
18.Arrays工具类提供很多的静态方法
①Arrays.toString(intArray) 将参数数组变成字符串
②Arrays.sort(intArray) 按照默认升序进行排序
19.数学工具类Math(静态方法如下)
①Math.abs(num) 取绝对值
②Math.ceil(num) 向上取整
③Math.floor(num) 向下取整
④Math.round(num) 四舍五入 (只保留整数)
⑤Math.PI
20.方法重写(覆盖)的注意事项:
①建议加@Override
②子类方法的返回值要【小于等于】父类方法返回值的范围
③子类方法的权限必须【大于等于】父类方法权限修饰符
public > protected > (default) > private
21.继承关系中,父子类构造方法访问特点
①子类的构造方法中有一个隐含的super()调用,一定是先调用父类构造,再执行子类构造
②子类构造可以通过super关键字来调用父类重载构造,且必须是子类构造方法中第一个语句
22.如果父类中的方法不确定如何进行方法实现,那么这应该是是一个抽象方法。比如动物吃东西的方法,猫和狗继承动物,吃东西的方法都是不一样的
23.抽象方法所在的类一定在class前面加上abstract关键字,表示这是一个抽象类,抽象类中也可以有非抽象方法
24.抽象类的子类必须重写父类全部抽象方法,如果不想重写全部,那么子类也得是一个抽象类。
抽象类无法创建对象,必须 再使用一个子类继承,才能用子类创建对象。
25.接口中能定义:常量(public static final),抽象方法(1.5),默认方法(default),静态方法(static)(1.8),私有方法(9)
26.接口中定义的抽象方法默认为public abstract 可以不写
27.接口中的注意事项:
①接口中没有静态代码块和构造方法
②一个类的直接父类是唯一的,但是可以实现多个接口
③如果实现类实现的多个接口中有重复的抽象方法,那么只需要覆盖重写一次
④如果实现类没有覆盖重写接口的所有抽象方法,那么实现类应该是一个抽象类
⑤如果实现类实现的多个接口中有重复的默认方法,那么实现类一定要对冲突的方法进行覆盖重写
⑥一个类如果继承的父类方法和实现的接口的默认方法冲突,优先使用父类的方法
28.多态中 Fu obj = new Zi();
成员变量:编译看左边,运行还看左边
成员方法:编译看左边,运行看右边
左边是父的意思,右边是子的意思
29.多态的好处:右边继承父类的子类再多,左边部分的父类写法都不会改变
30.对象的向上转型,其实就是多态
格式:父类名称 对象名 = new 子类名称(); Animal animal = new Cat();
创建了一只猫当做动物看待,没问题
**注意:**向上转型一定是安全的,从小范围转到了大范围,从小范围的猫向上转为更大范围的动物
类似于 double num = 100 int–>double 自动类型转换
对象的向下转型其实是一个还原的动作
格式:子类名称 对象名 = (子类名称)父类对象;
Animal animal = new Cat(); //本来是猫,向上转型成为动物
Cat cat = (cat) animal(); //本来是猫,已经被当成动物了,现在还原成猫
**注意:**必须要保证对象本来创建的时候就是猫,才能向下转型变成猫,
如果本来不是猫,非要向下转型成为猫,报错:ClassCastException
向下转型用来解决子类新添加一个方法,父类没有,如果父类调用animal.这个新方法,是出不来的,必须先向下转型还原成子类的对象
31.向下转型进行instanceof判断,判断这个对象是不是某一类的,例如 animal instanceof Cat; 返回值是boolean类型
32.final关键字可以用来修饰类,修饰方法,修饰局部变量,修饰成员方法。
①修饰类以后该类无法被继承
②修饰方法后该方法无法被覆盖重写
③修饰局部变量,如果是基本数据类型,那么赋值以后参数值无法改变,如果是引用数据类型,那么地址值不能改变,里面具体的参数值可以改变,地址值不变即可
④修饰成员变量,需要直接给这个成员变量赋初值,或者直接通过构造方法赋初值,然后删除setter方法,因为无法再进行赋值
33.Java中四种权限修饰符:
34.内部类相关:内用外随意访问,外用内,需要内部类对象。
使用成员内部类有两种方式:
1.间接方式:在外部类的方法中,创建内部类对象,调用内部类,然后main只是调用外部类
2.直接方式:外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
内部类中出现重名的变量现象,如果 想访问外部类的成员变量,格式是:外部类名称.this.外部类成员变量名
35.有成员内部类和局部内部类,成员内部类的内部类在外部类的方法外面,局部内部类的内部类在外部类的方法里面
36.定义一个类的时候,权限修饰符规则:
1.外部类:public , (default)
2.成员内部类:public,protected,(default),private
3.局部内部类:什么都不能写
37.如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下就可以省略掉该类的定义,而改为使用【匿名内部类】
匿名内部类定义格式:
接口名称 对象名 = new 接口名称() {
//覆盖重写所有的抽象方法
}
最后直接用对象名.这个抽象方法即可,就可以不用写一个新的接口的实现类Impl了
38.Scanner和ArrayList重写了toString(),Random没有重写toString(),所以没重写的返回的是地址值。