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

Java 多態深度解析:為什麼變量不能重寫而方法可以?

     編輯:程式設計綜合問答

現象

class Parent { String name = "Parent"; void print() { System.out.println("Parent"); } }
class Child extends Parent { String name = "Child"; void print() { System.out.println("Child"); } }

Parent p = new Child();
System.out.println(p.name); // 輸出 "Parent"
p.print();                  // 輸出 "Child"

變量顯示父類值,方法卻執行子類邏輯。

語言規範層面

  • 方法重寫:JVM 根據對象實際類型動態分發,實現多態。
  • 變量隱藏:編譯期靜態綁定,p.name 按引用類型 Parent 解析,無動態分發機制。

面向對象設計哲學

方法代表「行為契約」(介面),變量代表「狀態特徵」。多態核心是「同一介面,多種實現」,針對行為而非狀態。

  • 若允許變量多態,父類引用指向子類對象時,p.name 究竟佔多少記憶體?父類與子類同名字段內存佈局衝突無法解決。
  • 狀態應封裝,通過 getName()/setName() 訪問,由方法多態實現邏輯復用。

最佳實踐

  1. 所有字段 private,提供 getter/setter。
  2. 子類需「不同狀態表現」時,重寫 getter 而非重新聲明字段。
  3. 靜態分析工具開啟 FieldHidesSuperclassField 檢查,杜絕隱藏變量。

經典比喻

「洗衣粉能不能吃?」——從化學成分看有毒;從產品定位看是洗衣服用的,不是設計給人吃的。同理,變量不是為多態設計的。

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