首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 向上轉型:new 子類別物件指派給父類別參考,到底建立了哪個物件?

     編輯:程式設計綜合問答

核心結論

**`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`向下轉型成功執行期檢查物件真實型別

常見誤區澄清

  • ❌ 「建立父類別物件,再變成子類別」 → ✅ **一次 `new` 只建立一個物件,型別固定為 `new` 後的類別。**
  • ❌ 「佔用父類別大小的記憶體」 → ✅ **佔用子類別完整大小的記憶體** (含父類別欄位 + 子類別欄位 + 物件頭)。
  • ❌ 「向上轉型切掉子類別部分」 → ✅ **物件完整保留,只是參考「視野」變窄**。

實務應用場景


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` 右側決定;參考型別決定「能看見什麼」、「編譯期允許呼叫什麼」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved