在 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 中只有值传递,无论是基本数据类型还是引用数据类型,传递的都是值的副本。