核心定義
- Overload(多載):同一類別中定義多個同名方法,但參數列表不同(個數、型別、順序)。屬於編譯期多型(靜態綁定)。
- Override(覆寫):子類別定義與父類別同名、同參數、同回傳型別的方法,執行期依物件實際型別決定呼叫哪個版本。屬於執行期多型(動態綁定),是繼承體系多型的核心體現。
Override 關鍵規則
- 方法簽名完全一致:名稱、參數列表、回傳型別(Java 5+ 允許共變回傳型別)。
- 拋出異常限制:子類別只能拋出父類別相同或子類別的異常,不能新增更寬泛的受檢異常。
- 存取權限不得縮小:子類別方法權限 ≥ 父類別(public > protected > default > private)。
- private 方法不可覆寫:父類別私有方法對子類別不可見,子類別同名方法屬新定義,非覆寫。
- static/final 方法不可覆寫:static 屬類別非實例;final 禁止覆寫。
Overload 關鍵規則
- 參數列表必須不同:型別、個數、順序至少一項差異。
- 無法單靠回傳型別、權限、異常多載:若參數列表相同,僅回傳型別不同會導致編譯錯誤(呼叫端無法區分)。
- 可變更回傳型別:參數列表不同時,回傳型別可同可不同。
- 父類別 private 方法不可被子類別多載:子類別定義同名方法屬新方法,不構成多載關係。
常見誤區釐清
Q:Overload 方法能否改變回傳型別?
A:參數列表不同時可以;參數列表相同時不可(編譯器無法依回傳型別區分呼叫目標)。
比較總結表
| 特性 | Overload(多載) | Override(覆寫) |
| 發生範圍 | 同一類別 | 父子類別之間 |
| 參數列表 | 必須不同 | 必須相同 |
| 回傳型別 | 可同可不同 | 必須相同(或共變) |
| 存取權限 | 無限制 | 不能縮小 |
| 拋出異常 | 無限制 | 不能擴大 |
| 綁定時機 | 編譯期(靜態) | 執行期(動態) |
| 多型類型 | 編譯期多型 | 執行期多型 |
實務建議
- 善用
@Override 註解,編譯器自動驗證覆寫正確性。
- 多載時參數順序差異易造成呼叫端混淆,建議配合有意義的參數名稱或改用建造者模式。
- 覆寫時嚴守 Liskov 替換原則,確保子類別行為符合父類別契約。
掌握兩者差異,是精通 Java 物件導向與避免難以除錯問題的基石。