代碼場景
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()
核心機制:動態綁定
| 階段 | 動作 | 綁定類型 |
| 編譯期 | 檢查 Fu 類有無 show() 方法 | 靜態綁定(早期綁定) |
| 運行期 | JVM 根據**實際對象類型 (Zi)** 查找並調用 show() | 動態綁定(晚期綁定) |
三大條件(多態發生前提)
- 繼承:
Zi extends Fu
- 重寫:子類重寫父類方法(
@Override)
- 父類引用指向子類對象:
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() 編譯錯誤 → **引用類型無此方法**
- 🔑 **關鍵**:多態只適用於**實例方法重寫**,不適用於屬性、靜態方法、構造方法、私有方法
- 上一篇文章: Java 控制台輸出對象地址解決方法:重寫 toString()
- 下一篇文章: 京東客戶端消息推送實現方案:長連接/推送 SDK/系統級通道綜述
Copyright ©
程式碼之家 All Rights Reserved