複製代碼代碼如下:
public class Test4 {
@Test
public void test(){
child child = new child();
}
}
class parent{
public static String parentStaticField = "父類別靜態變數";
public String parentNormalField ="父類別普通變數";
static {
System.out.println(parentStaticField);
System.out.println("父類別靜態區塊");
}
{
System.out.println(parentNormalField);
System.out.println("父類別普通區塊");
}
public parent(){
System.out.println("父類別建構方法");
}
}
class child extends parent{
public static String childStaticField = "子類別靜態變數";
public String childNormalField ="子類別普通變數";
static {
System.out.println(childStaticField);
System.out.println("子類別靜態區塊");
}
{
System.out.println(childNormalField);
System.out.println("子類別普通區塊");
}
public child(){
System.out.println("子類別建構方法");
}
}
輸出:
複製代碼代碼如下:
父類別靜態變數
父類別靜態區塊
子類別靜態變數
子類別靜態區塊
父類別普通變數
父類別普通區塊
父類別建構方法
子類別普通變數
子類別普通區塊
子類別構造方法
執行過程:
1.執行到new child時,裝載器尋找已經編譯的child類別的程式碼(也就是child.class檔案)。在裝載的過程中,裝載器注意到它有一個基類,於是它再裝載基類。不管你創不創建基類對象,這個過程總是會發生。如果基類還有基類,那麼第二個基類也會被裝載,依此類推。
2.執行根基底類別的static初始化,然後是下一個衍生類別的static初始化,依此類推。這個順序非常重要,因為衍生類別的「static初始化」有可能要依賴基底類別成員的正確初始化。
3.當所有必要的類別都已經裝載結束,建立child類別物件。
4.child類別存在父類,則呼叫父類的建構函數,可以使用super來指定呼叫哪個建構子。
基類的構造過程以及構造順序,同派生類的相同。首先基類中各個變數依照字面順序初始化,然後執行基類的建構函數的其餘部分。
5.對子類別成員資料依照它們宣告的順序初始化,執行子類別建構函數的其餘部分。