多態是繼承與抽象之後的第三大 OOP 基石,實現「接口與實現分離」、「何謂」與「如何做」解耦,使代碼可擴展、可維護。
子類對象賦值給父類引用,自動發生,無需強轉。例:Instrument i = new Wind();。tune(Instrument) 可接收任何子類,避免為每種樂器寫重載方法。
class Instrument { void play(Note n) { ... } }
class Wind extends Instrument { void play(Note n) { ... } } // 覆蓋
void tune(Instrument i) { i.play(Note.MIDDLE_C); } // 多態調用
Wind flute = new Wind();
tune(flute); // 向上轉型,動態綁定調用 Wind.play()
final/private/static 方法動態綁定final 方法禁止覆蓋,編譯器可內聯優化class Shape { void draw(); void erase(); }
class Circle extends Shape { void draw() { println("Circle.draw"); } ... }
class Square extends Shape { ... }
class Triangle extends Shape { ... }
Shape[] shapes = new Shape[9];
for (int i=0; i
輸出隨機,證明編譯期無法知曉具體類型,完全靠運行期分派。
新增 Brass extends Wind、Woodwind extends Wind 等,tune()、tuneAll() 零修改 即可支持新類型。這就是「將變化隔離」的威力。
class InstrumentX { void play(int noteX) { ... } }
class WindX extends InstrumentX { void play(NoteX n) { ... } } // 參數類型不同 → 重載!
調用 tune(InstrumentX).play(NoteX.MIDDLE_C) 時,實參是 int,匹配父類 play(int),子類版本不被調用。覆蓋必須參數列表完全一致,建議加 @Override 註解編譯期檢查。
abstract void play(); 只有聲明無實現,強制子類實現abstractinterface Instrument5 { void play(); String what(); void adjust(); }public static final,方法默認 publicclass Hero extends ActionCharacter implements CanFight, CanSwim, CanFly —— 單繼承 + 多實現,解決 C++ 多重繼承菱形問題extends),構建接口層級Months)替代 enum(Java 5 前)private/protected,完全隱藏實現new Interface() { ... } 就地實現回調/策略Outer.this),可訪問所有成員(含 private)static 內部類:無外部引用,可獨立創建,常用作測試床Event 抽象基類:ready()、action()、description()Controller 管理 EventSet,run() 輪詢就緒事件執行 action()LightOn/WaterOff/Bell/Restart)作為 private 內部類,訪問外部狀態(light/water/thermostat)零阻力Glyph → RoundGlyph.draw() 讀到 radius=0final/private/static 方法instanceof)調用Stage 持有 Actor 接口,運行期動態換裝 HappyActor/SadActor,比繼承更靈活((MoreUseful)obj).u() 運行期檢查,失敗拋 ClassCastException多態非孤立特性,需配合抽象、繼承、動態綁定。核心價值:將變化的事物與不變的事物分離,擁抱變化,構建可擴展系統。掌握類之間的協作關系,而非孤立看待單個類,才是 OOP 精髓所在。