可以简单理解为类中的静态变量和静态代码块按顺序执行,然后有继承关系的要先初始化父类
可以查看字节码文件,如果翻译成十六进制会发现有clinit字眼
所谓实例就是加载某一个类的实例化对象,这个时候才去加载成员变量(即非静态变量)和非静态代码块,以及对应的构造器(最后),这里强调对应是因为构造器可以重载,创建几个对象就实例初始化几次
父类Father.class
public class Father {
private int i = test();
private static int j = method();
static {
System.out.print("1 ");
}
Father(){
System.out.print("2 ");
}
{
System.out.print("3 ");
}
public int test(){
System.out.print("4 ");
return 1;
}
public static int method(){
System.out.print("5 ");
return 1;
}
}
子类Son.class
public class Son extends Father {
private int i = test();
private static int j = method();
static {
System.out.print("6 ");
}
Son(){
System.out.print("7 ");
}
{
System.out.print("8 ");
}
public int test() {
System.out.print("9 ");
return 1;
}
public static int method(){
System.out.print("10 ");
return 1;
}
public static void main(String[] args) {
Son s1 = new Son();
System.out.println( );
Son s2 = new Son();
}
}
运行结果
其中5 1 10 6 代表类的初始化
932代表实例初始化,至于为何父类先于子类调用,开头却是9是因为test方法已经被子类重写了,所以即使调用了test方法执行的仍然是子类的test方法因此输出是9而不是4