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

Java 方法覆寫 vs 變數遮蔽:多型行為的關鍵差異

     編輯:Java 相關知識

核心定義

  • 方法覆寫:子類別定義與父類別同名、同參數、同回傳型別的方法,執行時依實際物件型別動態分派(多型)。
  • 變數遮蔽:子類別宣告與父類別同名欄位,編譯期依參考變數型別靜態綁定,不具備多型。

程式碼對比實驗

方法覆寫:多型生效

class People { public String getName() { return "people"; } }
class Student extends People { public String getName() { return "student"; } }

People pp = new Student();
System.out.println(pp.getName()); // 輸出 "student" ✅

變數遮蔽:無多型

class People { protected String name = "people"; }
class Student extends People { protected String name = "student"; }

People pp = new Student();
System.out.println(pp.name); // 輸出 "people" ❌(父類別欄位)

pp 編譯型別為 People,故存取 name 綁定父類別欄位。

混合情境:覆寫方法內存取遮蔽變數

class People {
    protected String name = "people";
    public String getName() { return name; }
}
class Student extends People {
    protected String name = "student";
    public String getName() { return name; } // 覆寫
}

People pp = new Student();
System.out.println(pp.getName()); // 輸出 "student" ✅

此時 getName() 動態分派至 Student,方法內 this.name 解析為子類別欄位,達到預期多型效果。

原理深度解析

最佳實踐

  1. 欄位一律 private,透過 Getter/Setter 存取,避免遮蔽混淆。
  2. 覆寫方法務必加 @Override,編譯期捕捉簽名錯誤。
  3. 若需子類別擁有獨立狀態,考慮組合優於繼承,或使用 protected 方法而非欄位。
  4. 程式碼審查時,留意 super.field 與 this.field 的混用風險。
「變數遮蔽是 Java 為了向前相容保留的 C++ 風格殘留,現代開發應視為反模式。」—— Effective Java 項目 17
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性方法覆寫變數遮蔽
綁定時機執行期(動態)編譯期(靜態)
依據實際物件型別參考變數宣告型別
多型支援是否
存取修飾詞限制不可縮小(public→protected ❌)無限制,甚至可改型別
@Override 註解建議加上,編譯器檢查不適用