New一个类的的时候,
- 执行父类的static成员和static代码块(按照先后顺序)
- 执行子类的static成员和static代码块(按照先后顺序)
- 执行父类的非static成员字段变量和代码块的初始化(按照先后顺序)
- 执行父类的构造方法
- 执行子类的非static成员字段变量和代码块的初始化(按照先后顺序)
- 执行子类的构造方法
记忆方法:从父到子,静态到非静态
参考链接
package excise;
class A{
static{
System.out.print("a");
}
public A(){
System.out.print("b");
}
}
class B extends A{
static{
System.out.print("c");
}
public B(){
System.out.print("d");
}
}
public class excise {
public static void main(String[] args) {
A b = new B();
b = new B();
}
}
输出结果:
acbdbd
解析:
易混淆
A b; //定义一个类变量(引用),类型为A,变量名b
b = new B() //实例化B,并将它赋值给b
而
A b = new B();
b = new B();
new了两次B(),其实第一次new的B还在,只不过找不到了,只能等待垃圾回收机制释放,b指向第二次new的B
第一次new的时候,首次static块会被加载到缓存中,第二次new的时候,不需要重复加载,直接用即可,所以static块只加载一次