基本概念
- **值传递**:在方法调用时,实参将自己的值复制一份传递给形参,方法内部对形参的修改不会影响到实参本身。
- **引用传递**:在方法调用时,实参将自己的引用(内存地址)传递给形参,方法内部对形参的修改会影响到实参本身。
Java 中的值传递
Java 中无论是基本数据类型还是引用数据类型,都是值传递。下面分别举例说明:
基本数据类型的值传递
java
public class PrimitivePassByValue {
public static void main(String[] args) {
int num = 10;
System.out.println("Before method call: " + num);
modifyNumber(num);
System.out.println("After method call: " + num);
}
public static void modifyNumber(int value) {
value = 20;
System.out.println("Inside method: " + value);
}
}
在上述代码中,`main` 方法中的 `num` 是一个基本数据类型的变量。当调用 `modifyNumber` 方法时,`num` 的值 `10` 被复制一份传递给了形参 `value`。在 `modifyNumber` 方法内部,`value` 被修改为 `20`,但这并不会影响到 `main` 方法中的 `num` 变量。程序的输出结果如下:
Before method call: 10
Inside method: 20
After method call: 10
引用数据类型的值传递
java
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);
modifyPerson(person);
System.out.println("After method call: " + person.name);
}
public static void modifyPerson(Person p) {
p.name = "Bob";
System.out.println("Inside method: " + p.name);
}
}
在这个例子中,`Person` 是一个引用数据类型。在 `main` 方法中创建了一个 `Person` 对象 `person`,并将其引用传递给 `modifyPerson` 方法。需要注意的是,传递的是引用的副本,而不是引用本身。在 `modifyPerson` 方法内部,通过这个引用副本修改了对象的属性 `name`,所以 `main` 方法中的 `person` 对象的 `name` 属性也会被修改。程序的输出结果如下:
Before method call: Alice
Inside method: Bob
After method call: Bob
虽然看起来像是引用传递,但实际上还是值传递,因为传递的是引用的副本,而不是引用本身。如果在 `modifyPerson` 方法中让 `p` 指向一个新的 `Person` 对象,并不会影响到 `main` 方法中的 `person` 对象。例如:
java
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);
modifyPerson(person);
System.out.println("After method call: " + person.name);
}
public static void modifyPerson(Person p) {
p = new Person("Bob");
System.out.println("Inside method: " + p.name);
}
}
程序的输出结果如下:
Before method call: Alice
Inside method: Bob
After method call: Alice
这表明 `modifyPerson` 方法中的 `p` 只是 `main` 方法中 `person` 引用的一个副本,对 `p` 重新赋值并不会影响到 `person`。
总结
Java 中只有值传递,对于基本数据类型,传递的是值的副本;对于引用数据类型,传递的是引用的副本。通过理解这一点,可以更好地处理方法参数传递和对象引用的问题。