java是引用传递还是值传递
在 Java 中,所有参数传递都是值传递(pass by value),但具体行为因数据类型(基本类型 vs. 引用类型)而有所不同。以下是详细解释:
1. 基本类型:值传递
- 定义:传递的是基本类型值的副本。
- 行为:方法内部对参数的修改不会影响原始变量。
- 示例:
public static void main(String[] args) { int num = 10; modify(num); System.out.println(num); // 输出 10(未被修改) } public static void modify(int n) { n = 20; // 修改的是副本,不影响原变量 }
2. 引用类型:引用的值传递
- 定义:传递的是对象引用的副本(即内存地址的拷贝)。
- 行为:
- 修改对象状态:方法内部通过引用修改对象的状态(如属性),会影响原始对象。
- 重新赋值引用:方法内部将引用指向新的对象,不会影响原始引用。
- 示例:
public static void main(String[] args) { StringBuilder sb = new StringBuilder("Hello"); modify(sb); System.out.println(sb); // 输出 "Hello World"(状态被修改) changeReference(sb); System.out.println(sb); // 输出 "Hello World"(引用未被改变) } public static void modify(StringBuilder builder) { builder.append(" World"); // 修改对象状态 } public static void changeReference(StringBuilder builder) { builder = new StringBuilder("New"); // 引用指向新对象,不影响原引用 }
3. 关键结论
- Java 没有引用传递(pass by reference),只有值传递。
- 对于引用类型:
- 传递的是引用的值(即内存地址的拷贝)。
- 方法内部可以通过引用修改对象的状态,但无法改变原始引用的指向。
- 类比:
- 传递基本类型:
int a = 5;传递的是5的拷贝。 - 传递引用类型:
StringBuilder sb;传递的是sb存储的地址的拷贝。
- 传递基本类型:
4. 图解说明
-
基本类型传递:
原始变量:num = 10 方法参数:n = 10(拷贝) 修改 n 为 20 → 原始 num 仍为 10 -
引用类型传递:
原始引用:sb → 地址 0x123(指向 "Hello" 对象) 方法参数:builder → 地址 0x123(拷贝) 修改 builder.append() → 修改地址 0x123 处的对象 重新赋值 builder → 地址变为 0x456(新对象),但原始 sb 仍指向 0x123
总结
- Java 始终是值传递,但引用类型的值传递会让人产生“引用传递”的错觉。
- 理解这一机制的关键在于区分“修改对象状态”和“修改引用指向”的不同。

浙公网安备 33010602011771号