在 Java 開發中,「值類型」與「引用類型」的區別是理解內存管理、參數傳遞行為及避免常見 Bug 的基石。本文將從定義、分類、內存分配、參數傳遞四個維度進行系統梳理。
| 分類 | 包含類型 | 關鍵字/示例 |
|---|---|---|
| 值類型 (四類八種) | 整型 | byte, short, int, long |
| 浮點型 | float, double | |
| 字符型 | char | |
| 邏輯型 | boolean | |
| 引用類型 | 除基本類型外的所有類型 | 類、接口、數組、String、枚舉等 |

關鍵結論:Java 中只有「值傳遞」。 但「值」的含義不同:
// 基本類型:不影響外部
public void testPrimitive(int num) {
num = 20; // 修改拷貝
}
int a = 10; testPrimitive(a); // a 仍為 10
// 引用類型:修改內部狀態生效
public void testRef(StringBuilder sb) {
sb.append(" World"); // 修改堆對象內容
}
StringBuilder s = new StringBuilder("Hello");
testRef(s); // s 變為 "Hello World"
// 引用類型:重新賦值不生效
public void testRefReassign(StringBuilder sb) {
sb = new StringBuilder("New"); // 只改變局部引用指向
}
StringBuilder s2 = new StringBuilder("Old");
testRefReassign(s2); // s2 仍指向 "Old"
String 是不可變對象,任何「修改」操作(如 `concat`, `replace`, `+`)都會產生新對象。因此傳遞 String 給方法後,在方法內「修改」實際是讓局部引用指向新對象,無法改變原字符串對象,行為類似基本類型。