方法參數
打個比方,值調用是克隆人,和母體本人無關;引用調用是本人的地址,可以找到本人,改變本人
1、調用基本類型
一個方法不能修改一個基本數據類型的參數,例如我們定義一個方法如下:
public static double threeMul(double x) {
return 3 * x;
}
然後調用這個方法:
double d = 100.0;
threeMul(d);
System.out.println(d);//輸出 100.0
System.out.println(threeMul(d));// 輸出300.0
說明方法 threeMul 無法改變 d 的值;具體執行過程是 x 被初始化爲 d 值得一個拷貝,也就是 100.0,接着返回 300.0,但是 d 仍然是100.0,方法結束之後,參數變量 x 不再使用。
2、調用引用類型
方法參數的類型有兩種,基本數據類型和對象引用,一個方法可以修改一個對象引用的狀態,因爲對象引用及其他的拷貝同時引用同一個對象。
例如:
我們設計一個簡單的 Employee 類:
class Employee {
private int id;
//只有 id 一個屬性
public Employee(int id) {
this.id = id;
}
public double getId() {
return id;//基本數據類型沒有克隆 clone
}
public void setId(int id) {
this.id = id;
}
}
和一個方法:
public static void raiseId(Employee x) {
x.setId(x.id + 10);
}
調用結果:
public static void main(String[] args) {
Employee a = new Employee(100);
raiseId(a);
System.out.println(a.id);// 輸出 110
}
3、Java 調用類型
注意: Java 程序設計語言總是採用值調用,不使用引用調用,也決定了一個方法不能讓對象參數引用一個新的對象
我們來設計一個反例:
寫一個嘗試更換兩個對象的方法:
public static void swap(Employee x, Employee y) {
Employee temp = x;
x = y;
y = temp;
}
如果可以成功,下面應該可以實現交換數據:
public static void main(String[] args) {
Employee a = new Employee(100);
Employee b = new Employee(200);
swap(a, b);
System.out.println(a.id);//輸出 100
System.out.println(b.id);//輸出 200
}
可見 swap 方法的參數 x 和 y 被初始化爲兩個對象引用的拷貝,這個方法交換的是這兩個拷貝, x 和 y 的確交換了對象參數然而結果沒有保留下來。