1.可以把this当成普通方法的返回值,即自己返回自己(return this),构造方法的隐式返回即返回自身(Object o = new Object();)
2.形参个数可变的方法,其本质是一个数组参数。在最后一个形参类型后加三点(…),该个数可变的形参既可以传入多个参数,也可以传人一个数组
public static void test(int a,String…books){
for(String tmp:books){
}
}
3.如果一个Java源文件里定义了一个public修饰的类,则这个源文件文件名必须与public修饰的类名相同,一个源文件里只能有一个public修饰的类
4.方法的重写规则:
① 方法名相同,形参列表相同
② 子类方法返回值类型相同(或更小?)
③ 子类方法声明抛出的异常类应比父类方法声明抛出的异常更小或相等
④ 子类方法的访问权限比父类方法访问权限更大或相等
5.引用变量在编译阶段只能调用其编译时类型所具有的方法,因此编写代码时,引用变量只能调用声明该变量时所用类里的方法。例如Object p=new Person();定义一个p,p只能调用Object类的方法,不能调用Person里的方法(Person重写的除外)
6.通过引用变量访问实例变量时,系统总是试图访问它编译类型所定义的成员变量,而不是运行时类型的成员变量(即对象的实例变量不具有多态性)
7.实例a instanceof 类名B,可以理解为:实例a是否可以转换成B类。a的编译时类型要么与后面的类相同,要么与后面的类有父子继承关系,否则编译错误
8.不要在父类构造器中调用将要在子类重写的方法
9.使用组合方式复用类时,需要显示创建被组合的类,如
classA{}
classB{
privateA a;
public B(A a1){
a=a1;
}
}
classC{
public static void main(String[] args){
A a=new A();
B b=new B(a);
}
}
10.静态初始化块是类相关的,系统将在类的初始化阶段执行静态初始化块,而不是创建对象时才执行,因此静态初始化块比普通初始化块先执行,且静态初始化块只执行一次。会像构造器一样上溯到Object类,先执行Object类的静态初始化块(如果有),然后执行其父类的静态初始化块,…最后才执行该类的静态初始化块。经过这个过程,才完成了该类的初始化过程,才可以在系统中使用这个类,包括访问这个类方法,类变量,或者创建这个类的实例。
11.与构造器类似,创建一个Java对象时,不仅会执行该类的普通初始化块和构造器,而且系统会一直上溯到Object类,先执行Object类的初始化块,再执行Object类的构造器,依次向下执行其父类的初始化块,开始执行其父类的构造器,…最后才执行该类的初始化块和构造器,返回该类的对象
12.实际上初始化块是一个假象,使用javac命令编译java类后,该java类中的初始化块会被还原到每个构造器中,且位于构造器所有代码的前面
13.若在初始化块和声明实例变量时都对变量进行初始化,指定初始值的顺序与初始化块和声明实例变量赋值语句的排列顺序相同(静态初始化块与声明静态变量与之类似)如:
public class InstanceInitTest{
{
a=6;
}
int a=9;
public static void main(String[] args){
System.out.println(newInstanceInitTest().a);
//输出9,先执行代码块,再执行赋值。若将上面顺序颠倒,则输出6。
}
}
14.==和equals方法的区别
①在Object类中,==和equals方法都是判断两个引用类型变量是否是同一个对象
②在其他类中,可以重写equals方法,如在String中,equals方法用来判断两个字符串内容是否相等,==仍然用于判断两个引用类型变量是否是同一个对象
注:==不可用于比较类型上没有父子关系的两个对象,会引起编译错误
15.”Hello”和new String(“Hello”)的区别
当Java使用类似于”Hello”的直接量时,JVM会在常量池来管理这些字符串,常量池保证相同的字符串直接量只有一个,不会产生多个副本;当使用new String(“Hello”)时,JVM会先使用常量池来管理”Hello”直接量,再调用String类的构造器在堆内存中创建一个新的String对象
16.final修饰的成员变量在显式初始化之前不能直接访问,但可以通过方法来访问,是Java设计的一个缺陷
17.abstract修饰类时,表明这个类只能被继承;当使用abstract修饰方法时,表明这个方法必须由子类重写。final修饰的方法不能被重写,修饰的类不能被继承,所以final和abstract永远不同时使用
18.static和abstract不能同时修饰某个方法,但可以同时修饰内部类
19.类不支持多继承,接口支持多继承。类可以实现多个接口
20.java内部类访问局部变量时局部变量必须声明为final
21.Scanner提供hasNextXxx()方法判断是否有下一个输入项,提供useDelimiter(“\n”)设置分隔符,该方法的参数是一个正则表达式
22.Java不允许在非静态内部类中定义静态成员
23.匿名内部类实现的抽象方法的方法体允许调用接口中定义的默认方法,但Lambda表达式不允许调用接口中的默认方法(default)