java类初始化顺序

类的初始化先后顺序

变量和代码块的执行顺序式根据代码的顺序来指定的,如果变量在代码块的前面则先执行变量,这两个的优先级都比构造函数高,如果是静态的话只初始化一次。
先后顺序是父类的静态变量/代码块 =》子类的静态变量/代码块 =》父类变量=》父类代码块 =》 父类的构造函数 =》子类变量=》子类代码块=》子类的构造函数。

代码示例

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)[email protected]

解析

  • 因为父类静态变量在静态代码块的前面所以先执行父类的静态变量=》静态代码块,然后子类的静态变量=》静态代码块。
  • 因为方法method在子类被重写所以父类输出10。
  • 静态变量以及静态代码块只在类第一次被加载的时候才执行,所以第二次类加载的时候不会执行了。

注: 代码块和变量是按照顺序执行的,即在前面的先执行

你可能感兴趣的:(java类初始化顺序)