Java中函数参数的传值和传引用
在Java中,函数参数的传值和传引用是由调用函数时使用的数据类型决定的。Java 中的变量可以分为基本数据类型(primitive data types)和对象引用(object references)两种类型。
基本数据类型:基本数据类型的值被存储在堆栈(stack)中。当将基本数据类型的值作为函数参数传递时,将传递一个副本(copy)到被调用的方法中,而原始的值不会改变。因为只是传递了一个副本,因此,被调用的方法对传递给它的副本的修改不会影响到原始的变量。
对象引用:对象引用,也称为对象,是类(class)的实例化结果。当将对象作为函数参数传递时,将传递该对象的引用(即内存地址)而非对象本身。通过该引用,被调用的方法可以操作传递给它的对象,并将对象的状态改变。也就是说,被调用方法操作对象也就等于改变了对象的状态,而这也会影响到调用方法的代码中该对象引用所代表的对象的状态。
下面,我们通过示例和程序来说明Java中函数参数的传值和传引用:
1. 传值
在Java中,基本数据类型(boolean、char、byte、short、int、long、float、double)被视为是传值。这意味着,当我们将它们作为函数参数传递时,我们传递的是该值的副本,而非该变量所在的内存地址。下面的程序演示了Java中基本数据类型的传值:
public class TestPassByValue {
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
public static void main(String[] args) {
int x = 10;
int y = 20;
System.out.println("Before swap: x = " + x + ", y = " + y);
swap(x, y);
System.out.println("After swap: x = " + x + ", y = " + y);
}
}
输出结果:
Before swap: x = 10, y = 20
After swap: x = 10, y = 20
我们会发现,计算机并没有交换x和y的值。为什么呢?因为我们传递给函数swap的只是x和y的副本,而非它们所在的内存地址。因此,swap函数中的变量a和b不会对x和y造成任何影响。
2. 传引用
在Java中,对象引用是视为传引用的。这意味着,当我们将对象引用作为函数参数传递时,我们传递的也是内存地址。下面的程序演示了Java中对象引用的传递:
public class TestPassByReference {
public static void switchPosition(Person p1, Person p2) {
String tempName = p1.getName();
p1.setName(p2.getName());
p2.setName(tempName);
}
public static void main(String[] args) {
Person tom = new Person("Tom");
Person jerry = new Person("Jerry");
System.out.println("Before switch: tom = " + tom.getName()
+ ", jerry = " + jerry.getName());
switchPosition(tom, jerry);
System.out.println("After switch: tom = " + tom.getName()
+ ", jerry = " + jerry.getName());
}
}
class Person {
private String name;
public Person(String n) {
name = n;
}
public String getName() {
return name;
}
public void setName(String n) {
name = n;
}
}
输出结果:
Before switch: tom = Tom, jerry = Jerry
After switch: tom = Jerry, jerry = Tom
在这个例子中,我们创建了两个Person对象:tom和jerry。然后我们调用了一个名为switchPosition的函数,该函数接受两个Person对象作为参数。当函数被调用时,该函数将p1和p2的名字互换,并将结果传递回调用函数。
值得注意的是,由于我们传递的是对象的引用(即内存地址),因此,当我们在switchPosition函数中改变p1和p2的状态时,调用方也将发生变化,导致调用方也能看到对象的新状态。
总结:
- 基本数据类型是传值。
- 对象是传引用。
- 传值时,传递的是值的副本,被调用函数对副本值的修改不会影响原值。
- 传引用时,传递的是对象的内存地址,被调用函数对该地址指向的对象状态的修改也会影响到调用者所持有的该对象的状态。
