| 維度 | 重載 | 重寫 |
| 簽名 | 必須不同 (參數列表),返回類型可同可不同 | 必須完全相同 (含返回類型) |
| 訪問權限 | 任意 | 不能比被重寫方法更私有 |
| 拋出異常 | 任意 | 不能拋出更多受檢異常,可拋出更少或無 |
| 綁定時機 | 編譯期 (靜態綁定) | 運行期 (動態分派) |
| 方法關係 | 獨立方法,名字巧合 | 子類覆蓋父類實現 |
| 相互調用 | 通過參數列表區分直接調用 | super.method() 調用父類實現,僅限直接父類 |
| static 參與 | 可重載 static/non-static,但同簽名一 static 一 non-static 編譯錯誤 | static 不參與重寫 (編譯期綁定),不能將 static 改為 non-static 或反過來 |
| 數量限制 | 無上限 | 每個父類方法在子類中最多重寫一次 |
變量遮蔽 (Shadowing/Hiding)
- 成員變量可被子類同名變量遮蔽
- 變量引用編譯期靜態綁定:父類引用指向子類對象,訪問變量仍取父類值
- 方法調用運行期動態綁定:同樣情況調用方法執行子類實現
class S1 { String s = "S1"; String getS() { return s; } }
class S2 extends S1 { String s = "S2"; String getS() { return s; } }
S1 s1 = new S2();
System.out.println(s1.s); // "S1" (變量靜態綁定)
System.out.println(s1.getS()); // "S2" (方法動態分派)
動態方法查找與 super 限制
- JVM 根據對象實際類型分派方法 (虛方法調用/晚綁定)
- 對象內部標記真實類型,支持
instanceof
super.method() 僅能訪問直接父類實現,super.super 非法
- 通過
((GrandParent)this).method() 強制轉型也無法訪問祖父類方法 (仍按實際類型分派)
- 但變量可通過強制轉型訪問祖先層級:
((GrandParent)this).field
私有方法與多態
- 私有方法不被繼承,子類同簽名方法是獨立新方法
- 私有方法調用編譯期靜態綁定,不參與動態分派
class A { private int f() { return 0; } public int g() { return 3; } }
class B extends A { private int f() { return 1; } public int g() { return f(); } }
class C extends B { public int f() { return 2; } }
A ref = new C();
System.out.println(((B)ref).g()); // 輸出 1 (B.g() 調用 B.f(),私有方法靜態綁定)
// 若 B.f() 非 private,輸出 2 (C.f() 覆蓋)
抽象類與構造器
- 包含抽象方法的類必須聲明
abstract,不可實例化
- 非抽象父類的方法可在子類中聲明為
abstract (使子類成為抽象類)
- 子類可聲明
abstract 無論父類是否抽象
掌握這些核心機制,是設計健壯、可擴展 Java 系統的基石。
- 上一篇文章: Java 垃圾回收機制核心知識點總結:回收觸發條件、finalize 方法、對象可達性與標記清除算法
- 下一篇文章: Java 運算子與指派深度解析(二)
Copyright ©
程式碼之家 All Rights Reserved