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

Java 繼承深度解析:字段遮蔽與方法重寫的陷阱

     編輯:Java 綜合教學

Java 繼承深度解析:字段遮蔽與方法重寫的陷阱

現象重現

父類 Father 定義 private int a = 1 及 getA()/setA();子類 A、B 分別定義 private int a = 2/3 並重寫 getA()/setA()。測試代碼:

Father fa = new A();
Father fb = new B();
System.out.println(fa.getA());        // 2
System.out.println(((A)fa).getA());   // 2
System.out.println(fb.getA());        // 3
System.out.println(((B)fb).getA());   // 3

輸出均為子類字段值。但若子類 不重寫 方法,輸出卻變為父類值 1。這背後機制是什麼?

核心原理解析

1. 字段無多態,只有遮蔽

private 字段不可繼承,子類聲明同名字段屬於「遮蔽」,父子類各自擁有獨立的 a。引用類型決定訪問哪個 a:父類引用訪問父類 a,子類引用訪問子類 a。

2. 方法有多態,動態分派

getA() 為非私有實例方法,子類重寫後,JVM 根據對象實際類型(A 或 B)動態分派到子類方法。子類方法內部 return a; 訪問的是子類自己的字段 a。

3. 兩種場景對比

場景子類重寫方法調用 fa.getA()解釋
場景一是子類值(2/3)動態分派到子類方法,子類方法讀子類字段
場景二否父類值(1)繼承父類方法,父類方法讀父類字段

最佳實踐建議

  • 字段私有化 + Getter/Setter:封裝內部狀態,避免直接暴露字段。
  • 避免同名字段:子類盡量不聲明與父類同名的字段,消除遮蔽困惑。
  • 理解多態邊界:多態僅適用於實例方法,不適用於字段、靜態方法、構造器、私有方法。

總結

「字段看引用類型,方法看對象類型」——這句口訣精準概括了 Java 繼承中字段遮蔽與方法重寫的核心差異。掌握此點,即可避開繼承層級中的常見坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved