class的裝載
在講class的初始化之前,我們來講解下class的裝載順序。
以下摘自《Thinking in Java 4》
由于Java 中的一切東西都是對象,所以許多活動
變得更加簡單,這個問題便是其中的一例。正如下一章會講到的那樣,每個對象的代碼都存在于獨立的文件中。除非真的需要代碼,否則那個文件是不會載入的。通常,我們可認為除非那個類的一個對象構造完畢,否則代碼不會真的載入。由于static 方法存在一些細微的歧義,所以也能認為“類代碼在首次使用的時候載入”。
首次使用的地方也是static 初始化發生的地方。裝載的時候,所有static 對象和static 代碼塊都會按照本來的順序初始化(亦即它們在類定義代碼里寫入的順序)。當然,static 數據只會初始化一次。
簡要的說就是,在類有繼承關系時,類加載器上溯造型,進行相關類的加載工作。
比如:
Class B extends Class A當我們new B()時,類加載器自動加載A的代碼
class的初始化順序
通常是以下這樣的初始化順序:
(static對象和static代碼塊,依據他們的順序進行初始化)>成員變量>構造函數

測試代碼
public class ClassInit { /** * @Title: main * @Description: 類初始化順序測試 * @param: @param args * @return: void * @throws */ public static void main(String[] args) { // TODO Auto-generated method stub new B(); }}class A { static{ System.out.println("A的static代碼塊..."); } public String s1 = prtString("A的成員變量..."); public static String s2 = prtString("A的static變量..."); public A(){ System.out.println("A的構造函數..."); } public static String prtString(String str) { System.out.println(str); return null; }}class B extends A{ public String ss1 = prtString("B的成員變量..."); public static String ss2 = prtString("B的static變量..."); public B(){ System.out.println("B的構造函數..."); } private static A a = new A(); static{ System.out.println("B的static代碼塊..."); } { System.out.println("代碼塊..."); } }測試結果
A的static代碼塊...
A的static變量...
B的static變量...
A的成員變量...
A的構造函數...
B的static代碼塊...
A的成員變量...
A的構造函數...
B的成員變量...
代碼塊...
B的構造函數...
總結
以上就是Java中class的初始化順序的全部內容,希望對大家使用Java能有所幫助。
新聞熱點
疑難解答