类的初始化先后顺序
变量和代码块的执行顺序式根据代码的顺序来指定的,如果变量在代码块的前面则先执行变量,这两个的优先级都比构造函数高,如果是静态的话只初始化一次。
先后顺序是父类的静态变量/代码块 =》子类的静态变量/代码块 =》父类变量=》父类代码块 =》 父类的构造函数 =》子类变量=》子类代码块=》子类的构造函数。
代码示例
public class LoadClass {
private static int i=staticMethod();
private int j=method();
static {
System.out.print("1 ");
}
{
System.out.print("2 ");
}
public LoadClass(){
System.out.print("3 ");
}
public static int staticMethod(){
System.out.print("4 ");
return 1;
}
public int method(){
System.out.print("5 ");
return 1;
}
}
class Son extends LoadClass{
private static int i=staticMethod();
private int j=method();
static {
System.out.print("6 ");
}
{
System.out.print("7 ");
}
public Son(){
System.out.print("8 ");
}
public static int staticMethod(){
System.out.print("9 ");
return 1;
}
public 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();
}
}
运行结果:
@LF}J97OJ96IWT@I)_6EA@F.png
解析
因为父类静态变量在静态代码块的前面所以先执行父类的静态变量=》静态代码块,然后子类的静态变量=》静态代码块。
因为方法method在子类被重写所以父类输出10。
静态变量以及静态代码块只在类第一次被加载的时候才执行,所以第二次类加载的时候不会执行了。
注: 代码块和变量是按照顺序执行的,即在前面的先执行