多態是物件導向三大特性(封裝、繼承、多態)中最具威力的一項。它允許「同一訊息,不同物件,不同行為」,透過動態綁定在執行期決定實際呼叫的方法,實現程式碼的解耦與擴充。
extends)或實作介面(implements)。@Override),方法簽名相同,實作不同。Parent obj = new Child();(向上轉型)。
// 父類別
abstract class Shape {
protected String color;
public Shape(String color) { this.color = color; }
public abstract double area(); // 抽象方法
public abstract void draw(); // 抽象方法
}
// 子類別:圓形
class Circle extends Shape {
private double radius;
public Circle(String color, double radius) {
super(color);
this.radius = radius;
}
@Override public double area() { return Math.PI * radius * radius; }
@Override public void draw() { System.out.println("畫圓形,顏色:" + color + ",半徑:" + radius); }
}
// 子類別:矩形
class Rectangle extends Shape {
private double width, height;
public Rectangle(String color, double w, double h) {
super(color);
this.width = w; this.height = h;
}
@Override public double area() { return width * height; }
@Override public void draw() { System.out.println("畫矩形,顏色:" + color + ",寬:" + width + " 高:" + height); }
}
// 客戶端程式碼
public class PolymorphismDemo {
public static void main(String[] args) {
Shape[] shapes = {
new Circle("紅", 5.0),
new Rectangle("藍", 4, 6),
new Circle("綠", 3.0)
};
double totalArea = 0;
for (Shape s : shapes) {
s.draw(); // 動態綁定:呼叫各自的 draw()
totalArea += s.area(); // 動態綁定:呼叫各自的 area()
}
System.out.println("總面積:" + totalArea);
}
}
畫圓形,顏色:紅,半徑:5.0 畫矩形,顏色:藍,寬:4.0 高:6.0 畫圓形,顏色:綠,半徑:3.0 總面積:115.5398...
| 優點 | 說明 |
|---|---|
| 可替換性 | 子類別物件可替換父類別參考,不影響客戶端程式碼。 |
| 可擴充性 | 新增子類別(如 Triangle)無需修改既有使用父類別的程式碼。 |
| 介面性 | 父類別定義共同介面(方法簽名),子類別實作細節。 |
| 靈活性 | 執行期可動態決定具體型別(如依配置檔實例化)。 |
| 簡化性 | 統一用父類別型別處理異構物件集合,減少型別判斷與分支。 |
s.color 存取的是參考型別(Shape)的屬性,非物件實際型別。若子類別定義同名屬性會造成遮蔽,不建議。多態是策略模式的基石。定義 interface Strategy { void execute(); },多種實作類別(ConcreteStrategyA, B...),客戶端持有 Strategy 參考,執行期注入不同策略,實現演算法熱插拔。