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

計算機程序思維邏輯(二):變量賦值與內存模型深度解析

     編輯:Java 綜合教學

賦值的本質:內存地址與值的綁定

聲明變量後,JVM 在棧幀分配一塊內存槽位,初始值不確定(局部變量)或默認值(字段)。賦值操作 就是將確定的值寫入該槽位,建立「變量名 → 內存地址 → 具體值」的映射關係。

基本類型賦值:值語義

整數類型

類型位數取值範圍
byte8-2⁷ ~ 2⁷-1 (-128~127)
short16-2¹⁵ ~ 2¹⁵-1
int32-2³¹ ~ 2³¹-1 (約 ±21 億)
long64-2⁶³ ~ 2⁶³-1

賦值規則:

  • 字面量直接賦值:int i = 9999;
  • long 字面量超出 int 範圍時必須加後綴 L/l: long big = 3232343433L;(因字面量默認 int 類型)。

浮點類型

類型位數大致範圍
float32±1.4E-45 ~ ±3.4E+38 (約 6-7 位有效數字)
double64±4.9E-324 ~ ±1.7E+308 (約 15-16 位有效數字)

賦值規則:

  • double d = 333.33; 直接賦值(字面量默認 double)。
  • float 必須加後綴 F/f: float f = 333.33f;。
  • 整數可隱式擴寬賦值給 float/double。

boolean 與 char

  • 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。

內存圖解:基本類型 vs 數組

// 代碼
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} 變為垃圾

若數組變量直接內聯存儲元素,長度固定無法指向不同大小的數組對象。引用機制實現了「變量不變,指向的數據對象可換」的靈活性。

關鍵區別:數組變量賦值 vs 元素賦值

  • arrA = arrB; → 改變引用指向(變量層面)。
  • arrA[0] = 99; → 修改堆上數組對象內容(數據層面)。

動態長度與不可變長度

數組長度在 new int[n] 瞬間確定,不可變。但可通過讓引用指向新數組實現「邏輯變長」:

int len = calculateLength();
int[] arr = new int[len]; // 長度動態決定
// arr.length 只讀,不可修改

小結

賦值是程序操作數據的起點。基本類型傳值、數組傳引用,理解內存佈局差異是避免「淺拷貝陷阱」「意外共享修改」等 Bug 的基石。下一步將探討數據如何參與運算、表達式求值順序與類型提升規則。

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