工作有三年之久了,突然感觉带有继承关系、父子俩既有静态变量又有成员变量的情况,变量的加载顺序很容易混淆,今晚写了个例子,总算是把关系搞清楚了
例子中,父类既有普遍的成员变量,也有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 "); }
执行结果如下:
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标识的代码,按顺序自上而下全部执行
->父类成员变量加载 -> 父类构造函数 -> 子类成员变量加载 -> 子类构造函数