繼承和初始化

楔子

java8學習筆記

繼承和初始化

當執行java Beetle,首先會試圖訪問Beetle類的mian() 方法(一個靜態方法),加載器啓動並找出Beetle類的編譯代碼(在名爲Beetle.class的文件中)。加載過程中,編譯器注意到有個基類,於是繼續加載基類。不論是否創建基類的對象,基類都會和被加載。

如果基類還存在自身的基類,那麼第二個基類也將被加載,依次類推。接下來,根基類(Insect) 的static 的初始化開始執行,接着是派生類。(派生類中的static的初始化可能依賴基類成員是否被正確地初始化)。

至此,必要的類都加載完畢,可以創建對象了。首先,對象中的所有基本變量都被置爲默認值,對象引用被設定爲null——這是通過將對象內存設爲二進制零值一舉生成的。接着會調用基類的構造器。基類構造器和派生類構造器一樣以相同的順序經歷相同的過程。當基類構造器完成後,實例變量按照文本順序初始化,最終,構造器的剩餘部分被執行。

class Insect {
    private int i = 9;
    protected int j;

    Insect() {
        System.out.println("i = " + i + ", j = " + j);
        j = 39;
    }

    private static int x1 = printInit("static Insect.x1 initialized");

    static int printInit(String s) {
        System.out.println(s);
        return 47;
    }
}

public class Beetle extends Insect {
    private int k = printInit("Beetle.k.initialized");

    public Beetle() {
        System.out.println("k = " + k);
        System.out.println("j = " + j);
    }

    private static int x2 = printInit("static Beetle.x2 initialized");

    public static void main(String[] args) {
        System.out.println("Beetle constructor");
        Beetle b = new Beetle();
    }
}

/*
* 繼承和初始化
* 當執行java Beetle,首先會試圖訪問Beetle類的`mian()` 方法(一個靜態方法),加載器啓動並找出Beetle類的編譯代碼(在名爲Beetle.class的文件中)。加載過程中,編譯器注意到有個基類,於是繼續加載基類。不論是否創建基類的對象,基類都會和被加載。

如果基類還存在自身的基類,那麼第二個基類也將被加載,依次類推。接下來,根基類(Insect) 的static 的初始化開始執行,接着是派生類。(派生類中的static的初始化可能依賴基類成員是否被正確地初始化)。

至此,必要的類都加載完畢,可以創建對象了。首先,對象中的所有基本變量都被置爲默認值,對象引用被設定爲null——這是通過將對象內存設爲二進制零值一舉生成的。接着會調用基類的構造器。基類構造器和派生類構造器一樣以相同的順序經歷相同的過程。當基類構造器完成後,實例變量按照文本順序初始化,最終,構造器的剩餘部分被執行。
*
* */


/*
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i = 9, j = 0
Beetle.k.initialized
k = 47
j = 39*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章