**`new` 後面的型別決定建立什麼物件。** `Parallelogram p = new Rectangle();` 在堆上建立 **`Rectangle` 物件**,`p` 只是型別為 `Parallelogram` 的參考變數指向該物件。
堆 (Heap) 棧 +--------------------------+ +-----------------+ | Rectangle 物件 |←-----| p (參考變數) | | - 繼承自 Parallelogram | | 型別: Parallelogram | | - 自有欄位/方法 | +-----------------+ +--------------------------+
| 操作 | 結果 | 說明 |
|---|---|---|
| `p.area()` | 呼叫 `Rectangle.area()` | 動態繫結:實際物件型別決定 |
| `p.width` (父類別欄位) | 存取 `Parallelogram.width` | 靜態繫結:參考變數型別決定 |
| `p.childOnlyMethod()` | 編譯錯誤 | 父類別參考看不見子類別專有成員 |
| `(Rectangle)p` | 向下轉型成功 | 執行期檢查物件真實型別 |
List shapes = new ArrayList<>();
shapes.add(new Circle(5));
shapes.add(new Rectangle(4, 6));
// 統一處理:只呼叫父類別介面
for (Shape s : shapes) {
System.out.println(s.getArea()); // 動態繫結各自實作
}
這正是多型的精髓:**以統一介面操作異構物件**。
**`new 誰,就是誰`** —— 物件型別由 `new` 右側決定;參考型別決定「能看見什麼」、「編譯期允許呼叫什麼」。