黃階低級 - 《 Java 核心》- 4.5 方法參數 - 修改0次

方法參數

打個比方,值調用是克隆人,和母體本人無關;引用調用是本人的地址,可以找到本人,改變本人

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 的確交換了對象參數然而結果沒有保留下來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章