聲明變量後,JVM 在棧幀分配一塊內存槽位,初始值不確定(局部變量)或默認值(字段)。賦值操作 就是將確定的值寫入該槽位,建立「變量名 → 內存地址 → 具體值」的映射關係。
| 類型 | 位數 | 取值範圍 |
|---|---|---|
| byte | 8 | -2⁷ ~ 2⁷-1 (-128~127) |
| short | 16 | -2¹⁵ ~ 2¹⁵-1 |
| int | 32 | -2³¹ ~ 2³¹-1 (約 ±21 億) |
| long | 64 | -2⁶³ ~ 2⁶³-1 |
賦值規則:
int i = 9999;long big = 3232343433L;(因字面量默認 int 類型)。| 類型 | 位數 | 大致範圍 |
|---|---|---|
| float | 32 | ±1.4E-45 ~ ±3.4E+38 (約 6-7 位有效數字) |
| double | 64 | ±4.9E-324 ~ ±1.7E+308 (約 15-16 位有效數字) |
賦值規則:
double d = 333.33; 直接賦值(字面量默認 double)。float f = 333.33f;。boolean flag = true; 只有 true/false 兩值。char c = 'A'; char zh = '中'; 使用單引號,UTF-16 編碼佔 2 字節。// 1. 靜態初始化(大括號語法糖)
int[] arr1 = {1, 2, 3};
// 2. 顯式 new 數組實例
int[] arr2 = new int[]{1, 2, 3};
// 3. 動態分配長度,後續逐元素賦值
int[] arr3 = new int[3];
arr3[0] = 1; arr3[1] = 2; arr3[2] = 3;
注意: new int[3]{1,2,3} 語法非法,長度由初始值自動推導。
動態分配長度時,元素自動初始化為類型默認值:數值型 0、boolean false、char '\u0000'、引用類型 null。
// 代碼
int a = 100;
int[] arr = {1, 2, 3};
// 內存佈局(簡化)
// 變量 a
地址 0x1000: 值 100
// 變量 arr (引用)
地址 0x2000: 值 0x3000 → 指向堆上數組對象
// 堆上數組對象
地址 0x3000: [長度=3, 元素0=1, 元素1=2, 元素2=3]
支持引用重新綁定:
int[] arrA = {1,2,3};
int[] arrB = {4,5,6,7};
arrA = arrB; // arrA 引用指向 arrB 的數組對象,原 {1,2,3} 變為垃圾
若數組變量直接內聯存儲元素,長度固定無法指向不同大小的數組對象。引用機制實現了「變量不變,指向的數據對象可換」的靈活性。
arrA = arrB; → 改變引用指向(變量層面)。arrA[0] = 99; → 修改堆上數組對象內容(數據層面)。數組長度在 new int[n] 瞬間確定,不可變。但可通過讓引用指向新數組實現「邏輯變長」:
int len = calculateLength();
int[] arr = new int[len]; // 長度動態決定
// arr.length 只讀,不可修改
賦值是程序操作數據的起點。基本類型傳值、數組傳引用,理解內存佈局差異是避免「淺拷貝陷阱」「意外共享修改」等 Bug 的基石。下一步將探討數據如何參與運算、表達式求值順序與類型提升規則。