工作有三年之久了,突然感覺帶有繼承關系、父子倆既有靜態變量又有成員變量的情況,變量的加載順序很容易混淆,今晚寫了個例子,總算是把關系搞清楚了
例子中,父類既有普遍的成員變量,也有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標識的代碼,按順序自上而下全部執行
->父類成員變量加載 -> 父類構造函數 -> 子類成員變量加載 -> 子類構造函數