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

Java 類別結構解析:屬性儲存在方法區,父子類同名屬性為何不覆蓋?

     編輯:程式設計綜合問答

JVM 記憶體區域速覽

區域儲存內容生命週期
方法區類別定義、常量、靜態變數、方法字節碼JVM 啟動 ~ 關閉
堆物件實例、陣列、實例變數(屬性)GC 管理
棧局部變數、方法呼叫框架執行緒私有,隨方法進出

屬性到底存在哪?

  • 靜態屬性:static 修飾 → **方法區**(屬於類別,共享唯一副本)。
  • 實例屬性:無 static → **堆**(屬於物件,每 new 一次分配一份)。
問題提到「屬性存儲在哪裡」,若指類別定義層面的屬性描述(名稱、型別、修飾符),則在方法區;若指運行時具體數值,實例屬性在堆,靜態屬性在方法區。

父子類同名屬性為何不覆蓋?

class Parent { String name = "Parent"; }
class Child extends Parent { String name = "Child"; }

Parent p = new Child();
System.out.println(p.name);        // 輸出 "Parent" —— 編譯期靜態綁定
System.out.println(((Child)p).name); // 輸出 "Child"

核心規則:

  1. 屬性無多型:存取屬性由參考型別決定(編譯期綁定),非物件實際型別。
  2. 遮蔽而非覆蓋:子類重新宣告同名屬性稱為 Field Hiding,父類屬性仍存在於物件記憶體佈局中,只是被子類屬性遮蔽。
  3. 方法才有多型:override 方法由 JVM 依實際物件型別動態分派。

記憶體佈局圖解

Child 物件在堆中佈局:
+------------------+
| Parent.name      |  <-- 父類屬性槽位
+------------------+
| Child.name       |  <-- 子類屬性槽位 (遮蔽父類)
+------------------+
| 其他實例欄位...   |
+------------------+

最佳實踐

  • 避免父子類同名屬性,造成困惑。
  • 若需共享狀態,父類定義 protected 屬性,子類直接使用,勿重複宣告。
  • 提供 getter/setter 封裝存取,若子類需不同行為,覆寫方法而非屬性。

總結

Java 屬性分為靜態(方法區)與實例(堆);父子類同名屬性屬於遮蔽,依參考型別靜態綁定,不具備多型特性。理解此機制能避免「以為覆蓋了父類屬性」的常見 Bug。

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