| 概念 | 英文 | 核心含義 |
|---|---|---|
| 繼承 | Inheritance | 子類獲取父類非私有成員(字段、方法),實現代碼復用與類型層級 |
| 重寫 | Overriding | 子類重新實現父類實例方法(同簽名),實現運行時多態 |
| 重載 | Overloading | 同一類中定義多個同名不同參數列表的方法,編譯時綁定 |
| 多態 | Polymorphism | 父類引用指向子類對象,調用重寫方法時執行子類實現 |
| 維度 | 繼承 | 重寫 | 重載 | 多態 |
|---|---|---|---|---|
| 發生位置 | 類之間(父子) | 子類中 | 同一類中 | 運行時對象調用 |
| 方法簽名 | 繼承原簽名 | 完全相同 | 名同參不同 | 調用重寫方法 |
| 綁定時機 | 編譯期 | 運行期(動態綁定) | 編譯期(靜態綁定) | 運行期 |
| 修飾符限制 | 不可減弱訪問權限 | 不可減弱權限、不可拋更廣異常 | 無特殊限制 | 依賴重寫 |
| 靜態方法 | 可繼承但不重寫 | 不可重寫(隱藏) | 可重載 | 不適用 |
| 構造器 | 不繼承(鏈式調用) | 不可重寫 | 可重載 | 不適用 |
| final 方法 | 可繼承不可重寫 | 禁止重寫 | 可重載 | 不適用 |
| private 方法 | 不可繼承 | 不可重寫 | 可重載 | 不適用 |
// 父類
class Shape {
public boolean isSharp() { return true; }
public int getSides() { return 0; } // 被重寫
public int getSides(Triangle t) { return 3; } // 重載
public int getSides(Rectangle r) { return 4; } // 重載
}
// 子類:重寫
class Triangle extends Shape {
@Override
public int getSides() { return 3; } // 重寫:同簽名
}
// 子類:重載(注意:這不是重寫!參數不同)
class Rectangle extends Shape {
public int getSides(int i) { return i; } // 重載:新簽名
}
// 測試多態
public class PolymorphismDemo {
public static void main(String[] args) {
Triangle tri = new Triangle();
System.out.println("Triangle is sharp? " + tri.isSharp()); // 繼承父類方法
// 多態:父類引用指向子類對象
Shape shape = new Triangle();
System.out.println("Sides: " + shape.getSides()); // 動態綁定:調用 Triangle.getSides() → 3
// 重載:編譯期根據參數類型綁定
Shape s2 = new Shape();
System.out.println(s2.getSides(new Triangle())); // 調用 Shape.getSides(Triangle) → 3
System.out.println(s2.getSides(new Rectangle())); // 調用 Shape.getSides(Rectangle) → 4
}
}
class Parent {
public void method(int i) {}
}
class Child extends Parent {
public void method(String s) {} // 這是重載!不是重寫
// @Override 會報錯
}
@Override 註解能編譯期檢測此類錯誤,強烈建議加上。
無多態時:父類需為每個子類提供重載方法 getSides(Triangle)、getSides(Rectangle)... 新增子類必須修改父類。
有多態時:父類只定義接口 getSides(),各子類各自重寫實現。新增子類零修改父類,符合開閉原則。
「繼承是子類使用父類的方法,多態是父類使用子類的方法。」
精準描述:父類引用(編譯時類型)調用重寫方法,實際執行子類實現(運行時類型)。
繼承建立類型層級,重寫實現行為差異化,重載提供同名便利,多態實現運行時動態分發。四者層層遞進:繼承是基礎,重寫是手段,多態是目的,重載是輔助。深度理解其區別、綁定時機、限制規則與設計意圖,是寫出可擴展、可維護面向對象代碼的關鍵。