核心口訣
實例方法被覆寫,靜態方法被隱藏;變量無覆寫,只有遮蔽。
方法篇:覆寫 vs 隱藏
實例方法 → 覆寫
- 子類同簽名實例方法覆寫父類方法
- 運行期動態分派:
Super s = new Sub(); s.instanceMethod() 調用 Sub 版本
@Override 註解可編譯期檢查
靜態方法 → 隱藏
- 子類同簽名靜態方法不構成覆寫,僅隱藏父類方法
- 編譯期靜態綁定:
Super s = new Sub(); s.staticMethod() 調用 Super 版本
- 若需調用子類靜態方法,必須用
Sub.staticMethod()
非法組合(編譯報錯)
- 子類靜態方法嘗試隱藏父類實例方法 ❌
- 子類實例方法嘗試覆寫父類靜態方法 ❌
final / private / static 方法不可被覆寫
abstract 方法必須在具體子類中覆寫
變量篇:遮蔽規則
Java 無變量覆寫,只有遮蔽。遮蔽發生於:
- 實例變量遮蔽父類同名實例變量
- 靜態變量遮蔽父類同名靜態/實例變量
- 實例變量遮蔽父類同名靜態變量
- 局部變量、參數、catch 參數永不遮蔽(同名直接編譯錯誤)
訪問被遮蔽變量
| 場景 | 語法 |
| 本類實例變量被局部變量遮蔽 | this.field |
| 父類實例變量被子類遮蔽 | super.field |
| 靜態變量(類變量) | ParentClass.field 或 ChildClass.field |
| 強制轉型訪問父類實例變量 | ((Parent) child).field |
代碼實證
class Base { int x=1; static int y=2; int z=3; }
class Sub extends Base { int x=4; int y=5; static int z=6; }
Sub s = new Sub();
System.out.println(s.x + " " + s.y + " " + s.z); // 4 5 6
Base b = s;
System.out.println(b.x + " " + b.y + " " + b.z); // 1 2 3
結論:變量遮蔽屬於靜態綁定,引用類型決定訪問哪個版本;實例方法屬於動態分派,對象實際類型決定調用哪個版本。
方法與變量遮蔽的關鍵差異
- 方法:無法通過全限定名或強轉訪問被覆寫的父類實例方法
- 變量:可以通過強轉父類型訪問被遮蔽的父類變量
- 靜態方法不可覆寫實例方法,但靜態變量可遮蔽實例變量
- 上一篇文章: JVM 類加載機制深度解析:原理、實現與自定義 ClassLoader 實戰
- 下一篇文章: PreparedStatement 最佳實踐:告別手動 SQL 拼接,提升安全與性能
Copyright ©
程式碼之家 All Rights Reserved