很長時間沒看這方面的內容了,寫篇文章讓自己牢記一下,順便分享一下。 首先,寫代碼以便檢驗結果。測試代碼: public class Test { public static void main(String[] args) { new Test2(); } } 子類代碼: public class ...
很長時間沒看這方面的內容了,寫篇文章讓自己牢記一下,順便分享一下。
首先,寫代碼以便檢驗結果。
測試代碼:
public class Test { public static void main(String[] args) { new Test2(); } }View Code
子類代碼:
public class Test2 extends Test3{ { System.out.println("子類代碼塊"); } private String address = getAddress(); static{ System.out.println("子類靜態代碼塊"); } private static String name = get1Name(); public Test2() { System.out.println("子類構造方法"); } private String getAddress() { System.out.println("子類成員變數"); return null; } private static String get1Name() { System.out.println("子類靜態變數"); return null; } }View Code
父類代碼:
public class Test3 { private static String name = getName(); private String address = getAddress(); static{ System.out.println("父類靜態代碼塊"); } { System.out.println("父類代碼塊"); } public Test3() { System.out.println("父類構造函數"); } private String getAddress() { System.out.println("父類成員變數"); return null; } private static String getName() { System.out.println("父類靜態變數"); return null; } }View Code
以上代碼就可以檢驗出類載入的順序了。
運行代碼,控制台列印結果如下:
有父類的情況.png
無父類的情況.png
多次調換代碼先後順序,發現 變數和代碼塊的載入順序和在代碼中的先後順序有關。
總結一下:
無父類情況下,載入順序為:
靜態成員變數、靜態代碼塊 ---》 成員變數、代碼塊 ----》 構造方法。
有父類的情況下,載入順序為:
父類靜態成員變數、父類靜態代碼塊 ---》 子類靜態成員變數、子類靜態代碼塊 -----》 父類成員變數、父類代碼塊
----》 父類構造方法 -----》 子類成員變數、子類代碼塊 ----》 子類構造方法。