准备一个雇员类:
public class Employee {
private String name;
private double salary;
public Employee(String n, double s) {
name = n;
salary = s;
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
}
首先,编写一个交换两个雇员对象的方法:
public static void swap(Employee x, Employee y) { // does't work
Employee temp = x;
x = y;
y = temp;
}
如果Java对对象采用的是按引用调用,那么swap方法就应该能够实现交换数据的效果:
Employee a = new Employee("Alice", 400);
Employee b = new Employee("Bob", 300);
swap(a,b);
// does a now refer to Bob, b to Alice?
但是,方法并没有改变存储在变量a和b中的对象引用。swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。
// x refers to Alice, y to Bob
Employee temp = x;
x = y;
y = temp;
// now x refers to Bob, y to Alice
可以输出看一下:
System.out.println("a.name=" + a.getName() + ",a.salary=" + a.getSalary());
System.out.println("b.name=" + b.getName() + ",b.salary=" + b.getSalary());
>>> a.name=Alice,a.salary=400.0
>>> b.name=Bob,b.salary=300.0
最终,白费力气。在方法结束时,参数变量x和y被丢弃了。原来的变量a和b仍然引用这个方法调用之前所引用的对象。
这个过程说明:Java程序设计语言对对象采用的不是引用调用,实际上,对象引用是按值传递的。
引用自《Java核心技术 卷I》