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

Java 多態機制詳解:父類引用指向子類對象調用重寫方法

     編輯:程式設計疑難解答

代碼場景

class Fu {
    public void show() {
        System.out.println("父類 show()");
    }
}

class Zi extends Fu {
    @Override
    public void show() {
        System.out.println("子類 show()");
    }
    public void method() {
        System.out.println("子類 method()");
    }
}

public class DuoTaiTest3 {
    public static void main(String[] args) {
        Fu f = new Zi(); // 父類引用指向子類對象
        f.show();        // 調用子類 show()
        // f.method();   // 編譯錯誤:父類引用無法訪問子類特有方法
    }
}

輸出結果

子類 show()

核心機制:動態綁定

三大條件(多態發生前提)

  1. 繼承:Zi extends Fu
  2. 重寫:子類重寫父類方法(@Override)
  3. 父類引用指向子類對象:Fu f = new Zi();

為什麼 f.method() 編譯錯誤?

  • 編譯器只看**引用類型 (Fu)**
  • Fu 類中**沒有** method() 方法
  • 編譯期綁定失敗 → 編譯錯誤

調用父類被重寫方法

class Zi extends Fu {
    @Override
    public void show() {
        super.show(); // 显式調用父類版本
        System.out.println("子類 show()");
    }
}

多態優勢

  • **可擴展性**:新增子類無需修改使用父類引用的代碼
  • **統一接口**:集合存儲 List<Fu> 可放入任意子類對象
  • **插件化架構**:框架定義接口,用戶實現具體邏輯

記憶口訣

編譯看左邊(引用類型),運行看右邊(實際對象)。
方法調用:有重寫調重寫,無重寫調父類。
屬性訪問:永遠看左邊(引用類型),無多態。

總結

  • ✅ f.show() 調用子類方法 → **動態綁定/多態**
  • ❌ f.method() 編譯錯誤 → **引用類型無此方法**
  • 🔑 **關鍵**:多態只適用於**實例方法重寫**,不適用於屬性、靜態方法、構造方法、私有方法
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
階段動作綁定類型
編譯期檢查 Fu 類有無 show() 方法靜態綁定(早期綁定)
運行期JVM 根據**實際對象類型 (Zi)** 查找並調用 show()動態綁定(晚期綁定)