think in java--7.10初始化及類載入的理解
阿新 • • 發佈:2018-11-16
1.在java中每個類都會編譯成一個獨立得檔案。該檔案只會在程式需要使用的時候才載入。可以說:類得程式碼在初次使用的時候才會載入。還有,當訪問static域或者方法時候,也會發生載入。初次使用之處也是static載入發生之處,所有的static物件和static方法都會在載入時按照程式順序載入,定義為static 只會被載入一次。
2.程式執行得順序:先找main入口,然後看看有沒有基類(extends關鍵字),如果有就初始化基類,依次類推,初始化完畢後然後按照程式執行。
3.每一個非基本型別的物件都有一個toString()方法,而且當編譯器需要一個String而你只有一個物件時,該方法被呼叫。
程式碼:
package test2; class A { static String a = print("a-static初始化"); static String print(String str) { System.out.println(str); return str; }; A() { System.out.println("A建構函式初始化"); }; public String toString() { return "呼叫物件的toString方法"; } }; class B extends A { static String b = print("b-static初始化"); static String print(String str) { System.out.println(str); return str; }; B() { System.out.println("B建構函式初始化"); }; }; class C { static String c = print("c-static初始化"); static String print(String str) { System.out.println(str); return str; } static A a = new A(); }; class D { D() { System.out.println("D建構函式初始化"); }; }; class Demo extends B { static String d = print("demo-static初始化"); static String print(String str) { System.out.println(str); return str; } Demo() { System.out.println("Demo建構函式初始化"); }; public static void main(String[] args) { System.out.println("測試開始"); System.out.println(C.a); D d2 = new D(); } }; /* a-static初始化 b-static初始化 demo-static初始化 測試開始 c-static初始化 A建構函式初始化 呼叫物件的toString方法 D建構函式初始化 */
程式碼說明:程式入口在main方法,Demo繼承於B類,B繼承於A類,A沒有父類,所以先載入A的編譯檔案,A中的static屬性先呼叫,列印"a-static初始化",然後依次載入B,Demo類,依次列印”b-static初始化“,”demo-static初始化“。然後程式往下走,列印”測試開始“,接著載入C類,列印”c-static初始化“,在C類裡面呼叫A類的建構函式,最後是新建一個D類,載入D類,呼叫建構函式。
個人理解:前面3行列印說明了對static的訪問會引發對類的載入,從C類中新建一個A類的物件可以看出,這裡只打印了A的建構函式,沒有在列印static屬性,這裡證明了類只加載了一次,並且static也只初始化一次。