代碼:
class Arr { public Arr() {} }
Arr[] a;
a = new Arr[1]; // 此處分配什麼?
a[0] = new Arr; // 此處分配什麼?
| 語句 | 分配內容 | 位置 | 說明 |
|---|---|---|---|
Arr[] a; | 棧上引用變量 (4/8 字節) | Stack | 僅聲明引用,指向 null |
a = new Arr[1]; | 陣列對象 (包含 1 個 Arr 引用槽位) | Managed Heap | 陣列本身是引用類型對象,初始化元素為 null |
a[0] = new Arr; | Arr 實例對象 | Managed Heap | 實際創建 Arr 對象,引用存入陣列槽位 |
Stack: a ──────┐
│ (引用)
Heap: Arr[] ◄──┘ (長度1,類型 Arr[])
[0] ──────┐
│ (引用)
Arr 實例 ◄──┘ (調用 Arr() 構造函數)
new T[N] 分配陣列對象 (繼承 System.Array),元素預設為 null (引用類型) 或 0/false (值類型)。new T() 分配單個對象實例。Arr[] a 與 a[0] 是完全獨立的兩個對象,類型分別為 Arr[] 和 Arr。理解 new 觸發堆分配,陣列與元素對象分離,避免混淆引用與實例。