多說無益,以下是本人親自試驗的程式碼,一目了然:
1 package test1; 2 3 public class Test { 4 public static void main(String[] argc) { 5 new Child(); 6 System.out.println("================================"); 7 new Child(); 8 } 9 } 10 11 class Child extends Parent{ 12 private static String staticField = getStaticField(); 13 static { 14 System.out.println("child静态方法块初始化"); 15 } 16 private String field = getField(); 17 { 18 System.out.println("child普通方法块初始化"); 19 } 20 21 public Child() { 22 System.out.println("child构造函数初始化"); 23 } 24 25 public static String getStaticField() { 26 System.out.println("child静态属性初始化"); 27 return "staticField"; 28 } 29 30 public static String getField() { 31 System.out.println("child普通属性初始化"); 32 return "field"; 33 } 34 } 35 36 class Parent { 37 private static String staticField = getStaticField(); 38 static { 39 System.out.println("parent静态方法块初始化"); 40 } 41 private String field = getField(); 42 { 43 System.out.println("parent普通方法块初始化"); 44 } 45 46 public Parent() { 47 System.out.println("parent构造函数初始化"); 48 } 49 50 public static String getStaticField() { 51 System.out.println("parent静态属性初始化"); 52 return "staticField"; 53 } 54 55 public static String getField() { 56 System.out.println("parent普通属性初始化"); 57 return "field"; 58 } 59 }
列印結果:
1 parent静态属性初始化 2 parent静态方法块初始化 3 child静态属性初始化 4 child静态方法块初始化 5 parent普通属性初始化 6 parent普通方法块初始化 7 parent构造函数初始化 8 child普通属性初始化 9 child普通方法块初始化 10 child构造函数初始化 11 ================================ 12 parent普通属性初始化 13 parent普通方法块初始化 14 parent构造函数初始化 15 child普通属性初始化 16 child普通方法块初始化 17 child构造函数初始化
經過取代靜態屬性和靜態初始化區塊的宣告順序發現靜態屬性和靜態初始化區塊的初始化順序和宣告順序有關,同理,普通屬性和普通初始化區塊的初始化順序和宣告順序有關。
總結:
# 當某一個類別滿足初始化的條件時(以後的部落格中會有總結),先初始化父類別(從頂層父類別Object依序向下初始化),然後初始化子類別;
初始化該類別時,最先初始化靜態屬性和靜態初始化區塊(和宣告順序有關),從頂層父類別Object依序向下初始化;
透過new建立物件時,先初始化普通屬性和普通初始化區塊(和宣告順序有關),再呼叫建構方法,同樣從頂層父類別Object依序向下執行;
################################## 靜態屬性和靜態初始化區塊只會初始化一次,類別初始化後,再透過new建立對象,只會重複執行第三步。 ############ 接下來引用Java程式設計思想的一句話:########## 在類別的內部,變數定義的先後順序決定了初始化的順序,即使變數定義散佈於方法定義之間,它們仍舊會在任何方法(包括建構器)被呼叫之前初始化。 ######
以上是Java類別的初始化順序是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!