class Parent {
public Parent() { System.out.println("Parent()"); }
public Parent(String msg) { System.out.println("Parent(String): " + msg); }
}
class Child extends Parent {
public Child() {
// 隱式調用 super(),即父類無參構造
System.out.println("Child()");
}
public Child(String msg) {
super(msg); // 顯式調用父類有參構造,必須是第一行
System.out.println("Child(String): " + msg);
}
}
// new Child() 輸出:Parent() → Child()
// new Child("Hi") 輸出:Parent(String): Hi → Child(String): Hi
規則:子類構造器首行若無 super(...) 或 this(...),編譯器自動插入 super()。父類無無參構造時,子類必須顯式調用 super(...)。
super() 調用
class Parent {
public Number getValue() { return 1; }
}
class Child extends Parent {
// 返回類型可以是父類返回類型的子類(協變返回類型,JDK 5+)
@Override
public Integer getValue() { return 2; } // Integer 是 Number 子類,合法
}
規則:重寫方法返回類型必須與父類相同,或為其子類型(協變)。基本類型必須完全一致。
| 類型 | 關鍵字 | 綁定時機 | 實現機制 |
|---|---|---|---|
| 靜態多態 (重載) | Overload | 編譯期 | 方法簽名不同(參數列表),靜態分派 |
| 動態多態 (重寫) | Override | 運行期 | 虛方法表,動態分派 |
super.method() 只能調用父類實現,不可鏈式調用祖父類