Animal a = new Dog())Animal animal1 = new Dog("旺財"); // 隱式向上轉型
animal1.eat(); // 呼叫 Dog 重寫的 eat()
animal1.sleep(); // 編譯錯誤!Animal 無 sleep() 方法
Animal a = new Dog("旺財");
// Dog d = (Dog) a; // 編譯通過,運行安全(實際是 Dog)
Animal a2 = new Cat("招財");
// Dog d2 = (Dog) a2; // 編譯通過,運行拋 ClassCastException!
if (animal instanceof Cat) {
Cat cat = (Cat) animal; // 安全轉型
cat.sleep(); // 可調用 Cat 特有方法
}
obj instanceof Type:運行時檢查 obj 是否為 Type 或其子類實例| 綁定類型 | 時機 | 適用方法 | 範例 |
|---|---|---|---|
| 靜態綁定 (早期綁定) | 編譯期 | final、static、private、構造器 | Person.sayHi() |
| 動態綁定 (晚期綁定) | 運行期 | 非上述所有實例方法 | Person p = new Teacher(); p.sayHi(); |
多態本質 = 動態綁定:運行時根據對象實際類型決定調用哪個重寫方法。
class School {
private ColorPrinter cp;
private BlackPrinter bp;
private ZhenPrinter zp;
public void setColorPrinter(ColorPrinter cp) { this.cp = cp; }
public void setBlackPrinter(BlackPrinter bp) { this.bp = bp; }
public void setZhenPrinter(ZhenPrinter zp) { this.zp = zp; }
public void print(String content) {
// 必須針對每種打印機寫判斷或多個方法
bp.print(content); // 寫死黑白打印機
}
}
abstract class Printer {
protected String brand;
public Printer(String brand) { this.brand = brand; }
public abstract void print(String content);
}
class ColorPrinter extends Printer {
public ColorPrinter(String b) { super(b); }
@Override public void print(String c) { System.out.println(brand + " 彩色列印:" + c); }
}
class BlackPrinter extends Printer { /* ... */ }
class ZhenPrinter extends Printer { /* ... */ }
class School {
private Printer printer; // 依賴抽象,而非具體實現
public void setPrinter(Printer p) { this.printer = p; } // 統一注入口
public void print(String content) {
printer.print(content); // 動態綁定,實際調用取決於注入的具體實現
}
}
// 使用
School school = new School();
school.setPrinter(new ZhenPrinter("戴爾")); // 可隨時切換 ColorPrinter/BlackPrinter
school.print("Hello Java");
print() 實現多態不是語法糖,而是物件導向設計應對變化的核心武器。掌握向上轉型的安全性、向下轉型的守護模式、動態綁定的分派機制,才能寫出真正可擴展的系統。