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

深入理解 Java 動態綁定:多態核心機制與子類覆寫行為解析

     編輯:Java 相關知識

動態綁定是 Java 實現多態的核心機制。當子類覆寫父類方法,並透過子類實例調用父類繼承的方法時,究竟會執行哪個版本的方法?本文透過經典代碼範例徹底釐清動態綁定的判斷邏輯與運行時行為。

核心代碼場景


class Base {
    int i = 47;
    int f() { return g(); }
    int g() { return i; }
}
class Derived extends Base {
    int i = 27; // 隱藏父類欄位
    int g() { return i; } // 覆寫父類方法
}
public class Test {
    public static void main(String[] args) {
        Derived d = new Derived();
        System.out.println(d.f()); // 輸出什麼?
    }
}

執行流程逐步推演

  1. d.f() 呼叫 Base.f()(子類未覆寫 f())
  2. Base.f() 內部執行 return g();
  3. 關鍵時刻:此處的 g() 是靜態綁定還是動態綁定?

動態綁定判斷鐵律

「調用當前對象實際類型的方法」 —— 運行時根據對象的真實類型(而非引用類型)決定調用哪個方法版本。

  • 對象 d 的實際類型是 Derived
  • 因此 g() 解析為 Derived.g()
  • Derived.g() 返回 this.i,即 Derived 的 i = 27
  • 最終輸出 27

關鍵概念釐清

概念說明本例表現
靜態綁定編譯期根據引用類型決定(private、static、final、建構子)不適用於本例 g()
動態綁定運行期根據對象實際類型決定(普通實例方法)g() 綁定至 Derived.g()
欄位隱藏子類同名欄位隱藏父類欄位,非覆寫,靜態綁定Base.i=47, Derived.i=27 互不干擾
方法覆寫子類同簽名方法覆寫父類,動態綁定Derived.g() 覆寫 Base.g()

多態實現的本質

動態綁定讓「同一介面、不同實作」成為可能:父類定義演算法骨架(f()),子類提供具體步驟實作(g()),運行時自動選擇正確版本。這正是範本方法模式的語言級支撐,也是 Java 物件導向多態的基石。

常見誤區提醒

  • ❌ 以為 Base.f() 內呼叫 g() 會綁定 Base.g() —— 錯誤,綁定看對象實際類型。
  • ❌ 以為欄位 i 也會動態綁定 —— 錯誤,欄位存取靜態綁定,Base.f() 中若直接存取 i 會得到 47。
  • ✅ 只有普通實例方法才有動態綁定行為。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved