楔子
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*/