首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 繼承中方法覆寫與隱藏、變量遮蔽的完整規則詳解

     編輯:Java 程式設計入門

核心口訣

實例方法被覆寫,靜態方法被隱藏;變量無覆寫,只有遮蔽。

方法篇:覆寫 vs 隱藏

實例方法 → 覆寫

  • 子類同簽名實例方法覆寫父類方法
  • 運行期動態分派:Super s = new Sub(); s.instanceMethod() 調用 Sub 版本
  • @Override 註解可編譯期檢查

靜態方法 → 隱藏

  • 子類同簽名靜態方法不構成覆寫,僅隱藏父類方法
  • 編譯期靜態綁定:Super s = new Sub(); s.staticMethod() 調用 Super 版本
  • 若需調用子類靜態方法,必須用 Sub.staticMethod()

非法組合(編譯報錯)

  • 子類靜態方法嘗試隱藏父類實例方法 ❌
  • 子類實例方法嘗試覆寫父類靜態方法 ❌
  • final / private / static 方法不可被覆寫
  • abstract 方法必須在具體子類中覆寫

變量篇:遮蔽規則

Java 無變量覆寫,只有遮蔽。遮蔽發生於:

  • 實例變量遮蔽父類同名實例變量
  • 靜態變量遮蔽父類同名靜態/實例變量
  • 實例變量遮蔽父類同名靜態變量
  • 局部變量、參數、catch 參數永不遮蔽(同名直接編譯錯誤)

訪問被遮蔽變量

代碼實證

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

結論:變量遮蔽屬於靜態綁定,引用類型決定訪問哪個版本;實例方法屬於動態分派,對象實際類型決定調用哪個版本。

方法與變量遮蔽的關鍵差異

  • 方法:無法通過全限定名或強轉訪問被覆寫的父類實例方法
  • 變量:可以通過強轉父類型訪問被遮蔽的父類變量
  • 靜態方法不可覆寫實例方法,但靜態變量可遮蔽實例變量
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景語法
本類實例變量被局部變量遮蔽this.field
父類實例變量被子類遮蔽super.field
靜態變量(類變量)ParentClass.field 或 ChildClass.field
強制轉型訪問父類實例變量((Parent) child).field