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"
}
p1.capture(p2):編譯期靜態綁定 Knight.capture(Piece),運行期動態分派執行該方法(重寫版)。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,不再查找子類重寫方法。
Parent ref = new Child() 時,調用重寫方法走子類實現,這是多態核心。