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

Java 成員變量無多態:父類引用指向子類對象訪問字段為何輸出父類值?

     編輯:程式設計綜合問答

現象代碼

A a = new B();
B b = new B();
a.show(); // 輸出 "B show"
b.show(); // 輸出 "B show"
System.out.println(a.a); // 輸出 5 (父類值)
System.out.println(b.a); // 輸出 6 (子類值)

原因解析

  • 方法調用:動態綁定,根據運行時對象類型(B)調用 B.show()。
  • 字段訪問:靜態綁定,根據編譯時引用類型(A 或 B)解析字段偏移量。a 編譯類型為 A,故訪問 A.a;b 編譯類型為 B,故訪問 B.a。

解決方案

在子類中提供 getA() 方法覆蓋父類,通過方法調用實現多態:

class B extends A {
    public int a = 6;
    @Override public int getA() { return a; }
}
// 使用
System.out.println(a.getA()); // 輸出 6

設計建議

字段應聲明為 private,對外暴露 getter/setter,避免直接訪問導致的多態失效與封裝破壞。

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