1、完整的初始化順序(含繼承)
1、父類的靜態初始化
父類靜態變量默認值 → 父類靜態變量顯式賦值 + 父類靜態代碼塊(按代碼順序執行)。
2、子類的靜態初始化
子類靜態變量默認值 → 子類靜態變量顯式賦值 + 子類靜態代碼塊(按代碼順序執行)。
3、父類的實例初始化
父類實例變量默認值 → 父類實例變量顯式賦值 + 父類實例代碼塊(按代碼順序執行)→ 父類構造函數。
4、子類的實例初始化
子類實例變量默認值 → 子類實例變量顯式賦值 + 子類實例代碼塊(按代碼順序執行)→ 子類構造函數。
2、代碼示例
class Parent {// 父類靜態變量private static String parentStaticField = initParentStaticField();// 父類靜態代碼塊static {System.out.println("父類靜態代碼塊執行");}// 父類實例變量private String parentInstanceField = initParentInstanceField();// 父類實例代碼塊{System.out.println("父類實例代碼塊執行");}// 父類構造函數public Parent() {System.out.println("父類構造函數執行");}// 父類初始化方法private static String initParentStaticField() {System.out.println("父類靜態變量賦值");return "parentStatic";}private String initParentInstanceField() {System.out.println("父類實例變量賦值");return "parentInstance";}
}public class Test extends Parent {// 子類靜態變量private static String staticField = initStaticField();// 子類靜態代碼塊static {System.out.println("子類靜態代碼塊執行");}// 子類實例變量private String instanceField = initInstanceField();// 子類實例代碼塊{System.out.println("子類實例代碼塊執行");}// 子類構造函數public Test() {System.out.println("子類構造函數執行");}// 子類初始化方法private static String initStaticField() {System.out.println("子類靜態變量賦值");return "static";}private String initInstanceField() {System.out.println("子類實例變量賦值");return "instance";}public static void main(String[] args) {new Test();}
}
執行結果:
父類靜態變量賦值 // 父類靜態初始化開始
父類靜態代碼塊執行 // 父類靜態初始化完成
子類靜態變量賦值 // 子類靜態初始化開始
子類靜態代碼塊執行 // 子類靜態初始化完成
父類實例變量賦值 // 父類實例初始化開始
父類實例代碼塊執行
父類構造函數執行 // 父類實例初始化完成
子類實例變量賦值 // 子類實例初始化開始
子類實例代碼塊執行
子類構造函數執行 // 子類實例初始化完成
分析:
可知通過繼承時候,當加載子類時候會優先加載父類,等父類全部加載完畢才會進行子類的加載,靜態變量特殊,如果