1. 程式人生 > >think in java--7.10初始化及類載入的理解

think in java--7.10初始化及類載入的理解

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也只初始化一次。