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

從 StackOverflow 經典案例看 Java 動態綁定與多態

     編輯:Java 綜合教學

從 StackOverflow 經典案例看 Java 動態綁定與多態

class Piece {
    public void capture() { System.out.println("Capture"); }
    public void capture(Piece p) { System.out.println("I'm bored"); }
}
class Knight extends Piece {
    public void capture(Piece p) { System.out.println("Knight is bored"); } // 重寫
    public void capture(Knight k) { System.out.println("Too slow buddy"); } // 重載
}
public static void main(String[] args) {
    Piece p2 = new Knight(); // 靜態類型 Piece,動態類型 Knight
    Knight p1 = new Knight();
    p1.capture(p2); // Knight.capture(Piece) → "Knight is bored"
    p2.capture(p1); // Piece.capture(Knight) → 動態分派調用 Knight.capture(Piece) → "Knight is bored"
}

核心解析

  1. p1.capture(p2):編譯期靜態綁定 Knight.capture(Piece),運行期動態分派執行該方法(重寫版)。
  2. p2.capture(p1):編譯期靜態類型 Piece,簽名匹配 capture(Piece);運行期 p2 實際指向 Knight 對象,動態綁定 查找並執行 Knight 中重寫的 capture(Piece)。

驗證實驗

註釋掉 Knight.capture(Piece) → 輸出 I'm bored / I'm bored:無重寫方法,退回父類實現。

p2 = new Piece() → 輸出 Knight is bored / Hello:動態類型為 Piece,不再查找子類重寫方法。

結論

  • Java 非私有實例方法默認 動態綁定(虛方法);
  • 重載(同名不同參數)靜態綁定,重寫(同名同參數)動態綁定;
  • Parent ref = new Child() 時,調用重寫方法走子類實現,這是多態核心。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved