根據圖片內容,題目考察 Java 繼承下的建構子呼叫順序與欄位初始化機制。
class Parent {
public String name;
public Parent(String pName) {
this.name = pName;
}
}
class Test extends Parent {
public Test(String Name) {
super("kitty"); // 1. 先呼叫父類建構子
name = "hello"; // 2. 再執行子類建構子內容
}
}
new Test("參數") 呼叫子類建構子super(...)this.name = "kitty" → 輸出 parentname = "hello" → 輸出 child| 知識點 | 說明 |
|---|---|
| 建構子鏈 | 子類建構子必須先完成父類初始化,super() 必須是第一行敘述 |
| 欄位遮蔽 | 子類同名欄位會遮蔽父類欄位,但父類建構子只能存取父類欄位 |
| 初始化順序 | 靜態區塊 → 父類實例初始化 → 父類建構子 → 子類實例初始化 → 子類建構子 |
| 多型與建構子 | 建構子不參與多型,無法覆寫,只能透過 super 呼叫 |
super() 隱含呼叫,導致父類無參建構子不存在時編譯錯誤
class A {
String s = "A欄位";
A() { print(s); }
void print(String x) { System.out.println(x); }
}
class B extends A {
String s = "B欄位";
B() { print(s); }
void print(String x) { System.out.println("B:" + x); }
}
new B(); // 輸出什麼?
輸出:A欄位 → B:B欄位
原因:父類建構子呼叫的是被覆寫的 print 方法(多型),但存取的是父類欄位 s;子類建構子同樣呼叫覆寫方法,存取子類欄位。