理解基本型別與引用型別在記憶體中的存儲差異、參數傳遞機制,是寫出無 Bug Java 代碼的基石。本文結合 JVM 記憶體模型圖解、實戰代碼驗證,徹底講透這一核心知識點。

| 維度 | 基本型別 | 引用型別 |
|---|---|---|
| 包含類型 | byte, short, int, long, float, double, char, boolean | 類、介面、陣列、枚舉、Annotation |
| 存儲位置 | 棧幀局部變量表(直接存值) | 棧存引用(地址),堆存對象實體 |
| 預設值 | 0, 0.0, false, '\u0000' | null |
| 賦值語義 | 值拷貝(深拷貝) | 引用拷貝(淺拷貝,指向同一對象) |
| == 比較 | 比較數值 | 比較引用地址 |
| 生命週期 | 隨作用域結束銷毀 | 由 GC 管理,無引用時回收 |
package com.liu.u6.copy1;
public class DataTypeDemo {
public static void main(String[] args) {
System.out.println("=== 基本型別 ===");
int num1 = 3;
int num2 = 5;
System.out.println("num1 原值:" + num1); // 3
num2 = num1; // 值拷貝
num2 = 8; // 修改 num2
System.out.println("num2 改後 num1:" + num1); // 3 未變
System.out.println("\n=== 引用型別 ===");
Person p1 = new Person();
p1.age = 23;
Person p2 = p1; // 引用拷貝,指向同一對象
System.out.println("修改前 p1.age:" + p1.age); // 23
p2.age = 29; // 通過 p2 修改對象屬性
System.out.println("修改後 p1.age:" + p1.age); // 29 同步變化!
}
}
class Person {
public int age;
}
=== 基本型別 ===
num1 原值:3
num2 改後 num1:3
=== 引用型別 ===
修改前 p1.age:23
修改後 p1.age:29
Java 唯一支援「值傳遞」
void modify(Person p) {
p.age = 30; // ✅ 修改對象內容,外部可見
p = new Person(); // ❌ 只改變區域引用指向,外部無感
}