1. 为什么Java的值传递总让人困惑
第一次接触Java参数传递机制时,我也曾被"引用传递"这个概念绕得晕头转向。直到在调试器里亲眼看到对象引用被复制传递的过程,才真正理解了Java严格遵循值传递的本质。这个看似基础的概念,实际上影响着我们对方法调用、对象操作等核心机制的理解深度。
在Java中,当我们将一个对象作为参数传递给方法时,传递的并不是对象本身,而是对象引用的副本。这就好比你把自家钥匙复制了一把给朋友,朋友可以用这把钥匙开门(修改对象内容),但如果朋友把这把钥匙重新配成其他钥匙(改变引用指向),你手里的原钥匙依然指向原来的门。这种机制与C++等语言中真正的引用传递有着本质区别。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 值传递与引用传递的底层原理
2.1 基本数据类型的值传递
对于基本数据类型(int、double等),Java的传递机制非常直观:
java复制void modify(int x) {
x = 10;
}
public static void main(String[] args) {
int num = 5;
modify(num);
System.out.println(num); // 输出5,原值未改变
}
这里num的值5被复制到x中,方法内修改x不会影响外部的num。这种传递方式所有开发者都能直观理解。
2.2 对象引用的值传递
困惑主要出现在对象传递时:
java复制class Person {
String name;
Person(String name) { this.name = name; }
}
void changeName(Person p) {
p.name = "Alice";
}
void changeReference(Person p) {
p = new Person("Bob");
}
public static void main(String[] args) {
Person person = new Person("Charlie");
changeName(person);
System.out.println(person.name); // 输出Alice
