準(zhǔn)備一個雇員類:
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對對象采用的是按引用調(diào)用,那么swap方法就應(yīng)該能夠?qū)崿F(xiàn)交換數(shù)據(jù)的效果:
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方法的參數(shù)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
最終捧搞,白費力氣。在方法結(jié)束時狮荔,參數(shù)變量x和y被丟棄了胎撇。原來的變量a和b仍然引用這個方法調(diào)用之前所引用的對象。
這個過程說明:Java程序設(shè)計語言對對象采用的不是引用調(diào)用殖氏,實際上晚树,對象引用是按值傳遞的。
引用自《Java核心技術(shù) 卷I》