java-查漏补缺,巩固理论知识
1、byte、short、char做简单运算,结果类型是int,查了下貌似没有原因,规范如此
2、char类型默认初始值,空字符,空格字符,空字符串
空字符:\u0000,是一个Unicode字符(\u开头),是控制字符(也叫不可显字符)
空格字符:\u0020,和前者不同
"\u0000":是一个包含一个空字符的字符串,"\u0000".length()=1
""是空字符串,里面不包含任何字符,长度是0
" "是空格字符串,里面包含一个空格,长度是1
" ".equals("\u0000") //false " ".equals("\u0020") //true '\u0000'+2 //2
3、方法的参数传递机制,基本数据类型,传递的是值,引用类型,传递的是对象的内存地址;String类型参数,也是引用传递,不是值传递,可以画堆栈图来理解
4、属性赋值的顺序
默认初始化值,显式初始化赋值,构造器中初始化赋值,方法或属性调用赋值,其中前三个只执行一次
5、this和super关键字
表示当前对象,this()表示调用构造方法,如果在构造器中调用,必须声明在首行
在构造器中调用this或super构造器时,都必须放在首行,因此不能同时都调用
如果没有显式调用带参数的构造器,默认会调用无参构造器(this或super)
子类构造器初始化过程中一定会调用父类构造器最终到调用Object类的构造器
6、子类和父类有同名属性时,子类的这个属性不会覆盖父类的同名属性,也就是同时存在,未指定时默认是子类的属性
7、类和类之间的关系:泛化(继承),实现,聚合(电脑和组成电脑的鼠标键盘等部件,可以独立使用),组合(公司和部门关系,不可分割),关联,依赖
8、多态
父类引用指向子类对象:Animal dog = new Dog()
对于方法调用,编译时看左边,运行时看右边(编译时检查父类类型,运行时执行子类类型)
对于属性访问,编译和运行时都看左边(只看引用变量所属的类型)
对于类型转换,父类转换为子类,可能会报类型转换异常,子类转换为父类是一定可以转换成功的
父类引用只能调用父类中声明过的方法,不能调用子类独有的方法。运行时实际调用的是子类覆盖的方法(动态绑定)
对于父类被覆盖的方法,统称为虚拟方法
9、对象被回收之前,会调用它的finalize()方法
10、new Boolean("true123") //false new Boolean("TrUe") //true 查阅源码
public Boolean(String s) { this(parseBoolean(s)); } public static boolean parseBoolean(String s) { return ((s != null) && s.equalsIgnoreCase("true")); }
11、Arrays.asList(xx),其中xx是一个数组
当xx更新时,返回的这个list也会自动更新;得到的list长度是不可变的;不支持add,remove,clear方法
12、java中类不支持多继承,但是接口支持多继承,interface A extends B,C(B,C都是interface),例如spring中的应用上下文类
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver
13、代码块作用
用来初始化类或者对象;
静态代码块随着类加载执行且只执行一次,用于初始化类信息;优先于非静态代码块执行;只能调用静态属性,静态方法
非静态代码块随着对象创建而执行,每创建一个对象就执行一次;
14、final修饰局部变量或者方法的形参时,该变量或参数只能使用,不能再重新赋值或修改
15、类加载的顺序:先父类后子类,静态先执行,最后构造方法
16、抽象类的匿名子类对象,接口的匿名实现类编写方法
17、抽象类的典型设计模式-模板方法模式
18、接口的典型设计模式-代理模式
19、构造方法,static对应的典型设计模式-单例模式
20、java8 接口中定义的静态方法,只能接口自己调用,实现类不能调用,接口中定义的默认方法,其实现类的对象可以调用
如果实现类实现了多个接口,而这多个接口中定义了同名同参的默认方法,那么这个实现类必须重写这个默认方法,否则调用时报错
如何在实现类中调用接口中定义的默认方法?
假设下面4个类中都定义了show()方法,其中SubClass这个类的show()是重写的; public class SubClass extends SuperClass implements InterfA,InterfB{ public void test(){ show(); //调用自己重写的方法 super.show(); //调用父类的方法 InterfA.super.show(); //调用接口的默认方法 InterfB.super.show(); //调用接口的默认方法 } } 接口名.super.方法名()
21、子类抛出的异常不能大于父类抛出的异常
22、内部类分为成员内部类(static的和非static的)和局部内部类(定义在方法内或代码块内或构造器内),局部内部类的方式用的极少,可不不关注,也不推荐,以下都是指前者
内部类一方面作为外部类的成员,可以调用外部类的结构,可以被static修饰,可以被4种不同的权限修饰
另一方面作为一个类,可以定义属性,方法,构造器;可以被final修饰,可以被abstract修饰
23、枚举类的父类是java.lang.Enum,枚举类的属性建议用private final修饰,因为枚举类的属性值事先已经确定,定义成final表明这个属性一旦初始化后不可更改(基本类型是值不可更改,引用类型是引用地址不再更改)