一、核心结论与常见误解
Java 中只有值传递(pass-by-value),没有引用传递(pass-by-reference)。这是 Java 语言规范中明确规定的行为,也是面试中最容易答错的核心知识点之一。但对于引用类型(对象、数组等),传递的是对象引用的副本值,这导致许多人产生了'Java 有引用传递'的误解。
我们先看一个直观对比:
| 传递类型 | 传递内容 | 能否修改原始对象内容 | 能否改变原始引用指向 |
|---|---|---|---|
| 基本类型(int 等) | 实际值的副本 | ❌ | N/A |
| 引用类型(对象等) | 对象引用的副本值 | ✅ | ❌ |
最常见的误解场景:当我们将一个对象传递给方法,并在方法内成功修改了该对象的属性时,很多人会认为'这是引用传递'。实际上,这只是因为方法内通过引用副本访问到了原始对象,并非真正的引用传递。
// 误解示例:看似'引用传递'的现象
public static void main(String[] args) {
Person person = new Person("Alice");
modifyName(person, "Bob");
System.out.println(person.getName()); // 输出 Bob - 但这仍是值传递!
}
static void modifyName(Person p, String newName) {
p.setName(newName); // 通过引用副本修改了原始对象
}
二、值传递 vs 引用传递:根本区别解析
2.1 生活类比:钥匙与保险柜
想象你有一个保险柜(对象),你拿着它的钥匙(引用):
- 值传递:朋友来访时,你给了他一把复制的钥匙(引用副本)。他用这把钥匙:
- ✅ 可以打开保险柜,放入或取出物品(修改对象内容)
- ❌ 但他如果配了新钥匙(
new新对象),你的原钥匙不会变 - ❌ 他如果扔掉复制的钥匙(
arr = null),你的原钥匙不受影响
- 引用传递:朋友来访时,你直接把原钥匙交给他(传递引用本身)。他用这把钥匙:
- ✅ 可以打开保险柜修改内容


