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

Java 泛型與繼承陷阱:子類覆蓋父類同名字段導致 toString() 輸出 null

     編輯:程式設計綜合問答

問題現場

父類 Person 有 name 字段與 toString() 返回 getName()。子類 Student、Worker 又各自定義了同名 name 字段,但未重寫 getName()。運行時輸出全為 null。

根本原因

  • 子類聲明 private String name; 遮蔽了父類字段(字段不具備多態性)。
  • Person.toString() 調用 this.getName(),因子類未重寫,實際調用父類 getName(),返回父類 name(默認 null)。
  • 子類構造器賦值的是子類自己的 name,父類 name 從未被賦值。

修正方案(三選一)

  1. 推薦:子類不再聲明 name 字段,直接復用父類字段,構造器調用 super(name)。
  2. 子類重寫 getName() 返回自己的 name。
  3. 子類重寫 toString() 直接訪問自己的 name。

正確代碼示例(方案一)

class Student extends Person {
    // 刪除 private String name;
    public Student(String name) { super(name); }
    public void study() { System.out.println("學生在學習"); }
}

核心原則

字段不參與多態,避免父子類同名字段。 若需擴展屬性,應通過方法覆寫實現,而非字段遮蔽。

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