代碼示例中 Wife.listen(Bird bird) 接受 Bird 參數,傳入 Parrot 或 Sparrow 均可正確調用各自 moo()。題主疑問:直接 new Parrot().moo() 不更簡單?為何要繼承與多態?
// 不使用多態:每新增一種鳥,調用處都要修改
public class Zoo {
public void listenAll() {
new Parrot().moo();
new Sparrow().moo();
new Swallow().moo(); // 新增燕子需改此處
}
}
// 使用多態:調用處完全不變
public class Zoo {
public void listenAll(List birds) {
for (Bird b : birds) b.moo(); // 新增燕子只需新增 Swallow 類
}
}
Bird 封裝 wing、fly() 等共性。子類只需覆寫差異行為 moo()。若無繼承,每個鳥類都要重複定義翅膀、飛行邏輯,維護災難。
框架(如 Spring)掃描類路徑發現所有 Bird 實現類,無需硬編碼即可裝配。編譯期不需要知道具體子類。
new Parrot().moo() 解決「如何叫」,Wife.listen(new Parrot()) 解決「誰來聽、怎麼聽、未來怎麼擴展」。多態不是為了炫技,而是為了**應對變化**。