在 Java 中,实际上只有值传递,这可以从基本数据类型和引用数据类型两个方面来看。
基本概念
- 值传递:指在方法调用时,将实际参数的值复制一份传递给形式参数,在方法内部对形式参数的修改不会影响到实际参数。
- 引用传递:指在方法调用时,将实际参数的引用(内存地址)直接传递给形式参数,在方法内部对形式参数的修改会影响到实际参数。
基本数据类型的值传递
基本数据类型(如int、char、double等)在 Java 中是按值传递的。下面是一个示例代码:
public class PrimitivePassByValue {
public static void main(String[] args) {
int num = 10;
System.out.println("Before method call: " + num);
changeValue(num);
System.out.println("After method call: " + num);
}
public static void changeValue(int value) {
value = 20;
System.out.println("Inside method: " + value);
}
}
代码解释:
- 在
main方法中,定义了一个int类型的变量num并初始化为10。 - 调用
changeValue方法时,将num的值10复制一份传递给changeValue方法的参数value。 - 在
changeValue方法内部,将value的值修改为20,但这只是对复制的值进行修改,不会影响到main方法中的num变量。 - 运行结果如下:
Before method call: 10
Inside method: 20
After method call: 10
引用数据类型的值传递
对于引用数据类型(如Object、Array等),同样是按值传递的,只不过传递的是引用的副本。下面是一个示例代码:
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
public class ReferencePassByValue {
public static void main(String[] args) {
Person person = new Person("Alice");
System.out.println("Before method call: " + person.name);
changeName(person);
System.out.println("After method call: " + person.name);
}
public static void changeName(Person p) {
p.name = "Bob";
System.out.println("Inside method: " + p.name);
}
}
代码解释:
- 在
main方法中,创建了一个Person对象person,并将其name属性初始化为"Alice"。 - 调用
changeName方法时,将person引用的副本传递给changeName方法的参数p。 - 在
changeName方法内部,通过p引用修改了Person对象的name属性为"Bob",由于p和person引用的是同一个对象,所以main方法中的person对象的name属性也被修改了。 - 运行结果如下:
Before method call: Alice
Inside method: Bob
After method call: Bob
综上所述,Java 中只有值传递,无论是基本数据类型还是引用数据类型,传递的都是值的副本。


















