1.clinit(类)初始化 执行父类静态变量和静态代码块 5 1,然后执行子类静态变量和静态代码块 10 6 ,
2.init(实例)初始化 子类构造器中有默认super()实现,执行父类非静态变量和非静态代码块和构造器 9 3 2 ,
然后执行子类非静态变量和非静态代码块和构造器 9 8 7,
因为在子类中对父类的test进行了重写,所以i=test()调用的是父类的,输出9
3.当再次new时,由于类初始化完成存在堆中,所以在执行一次实例初始化9 3 2 9 8 7
4.静态变量和静态代码块可以换位置,非静态也是
父类代码
package myjava.clinitandinit;
public class Father {
private int i = test();
private static int j = method1();
static {
System.out.println("1");
}
public Father(){
System.out.println("2");
}
{
System.out.println("3");
}
public int test() {
System.out.println("4");
return 1;
}
public static int method1(){
System.out.println("5");
return 2;
}
}
子类代码
package myjava.clinitandinit;
public class Son extends Father {
private int i = test();
private static int j = method1();
static {
System.out.println("6");
}
public Son(){
System.out.println("7");
}
{
System.out.println("8");
}
@Override
public int test() {
System.out.println("9");
return 1;
}
public static int method1(){
System.out.println("10");
return 2;
}
public static void main(String[] args) {
Son son = new Son();
System.out.println();
Son son1 = new Son();
}
}
执行结果