java 类属性的加载顺序(带有继承关系的)

工作有三年之久了,突然感觉带有继承关系、父子俩既有静态变量又有成员变量的情况,变量的加载顺序很容易混淆,今晚写了个例子,总算是把关系搞清楚了

例子中,父类既有普遍的成员变量,也有static变量,也有static代码块,在父类的构造器前后都有static变量及普通变量,让我们看看初始化子类的时候会发生什么吧

先提供完整代码:

LoadSequence.java

public class LoadSequence {
    public static void main(String[] args) {
        new LsSon();
        
    }
}

class PrintObj {
    public PrintObj(String str) {
        System.out.println(str);
    }
}

class LsFather {
    static PrintObj po1 = new PrintObj("LsFather static new 1 ");

    PrintObj po2 = new PrintObj("LsFather new 2 ");
    
    static {
        System.out.println("LsFather static");
    }

    public LsFather() {
        System.out.println("LsFather()");
    }
}

class LsSon extends LsFather {
    static PrintObj po3 = new PrintObj("LsSon static new 3 ");

    PrintObj po4 = new PrintObj("LsSon new 4 ");

    static {
        System.out.println("LsSon static");
    }

    public LsSon() {
        System.out.println("LsSon()");
    }
    
    static PrintObj po5 = new PrintObj("LsSon static new 6 ");
    
    PrintObj po6 = new PrintObj("LsSon new 6 ");

}
View Code

执行结果如下:

LsFather static new 1
LsFather static
LsSon static new 3
LsSon static
LsSon static new 6
LsFather new 2
LsFather()
LsSon new 4
LsSon new 6
LsSon()

由于可知:

带有继承关系的,实例化子类时,加载顺序如下:

父类static标识的代码,按顺序自上而下全部执行  ->  子类static标识的代码,按顺序自上而下全部执行

->父类成员变量加载 -> 父类构造函数 -> 子类成员变量加载 -> 子类构造函数

原文地址:https://www.cnblogs.com/goldeneast/p/6049414.html