java參數傳遞 -- 按值調用

一些術語的解釋

  1. 按值調用:表示方法接收的是調用者提供的值。即方法的得到的是變量的一份拷貝,而非原本的變量。
  2. 按引用調用:表示方法接收的是調用者提供的變量地址。方法的得到的是原本的變量的引用。

一個方法可以修改 按引用調用 傳入的變量值,而不可以修改 按值調用 傳入的變量值。

在java中,總是 按值調用,即方法得到的總是所有參數值的一個拷貝,無法修改原本變量的內容。

所以,在java中,一個方法不可能修改一個基本數據類型的參數。但是將對象作爲參數就可以實現這一操作。

例如:

對一個基本數據類型的變量進行操作:

public static void tripleValue(int a){
    a = a * 3;
}
int a = 10;
tripleValue(a);

並不會改變a的值。內存示意圖如下:
image

變量被進行了複製操作。

而對對象進行操作就不同了:

public static void tripleValue(NumContent a){
    a.tripleIt();
}
a = new NumContent();
tripleValue(a);

內存模型如下:
image

可以看到,這裏被複制的是對象的引用,但是仍舊指向原本的內存地址。

然而,這並不意味着java對於對象採用的是 按引用調用。下面是一個反例:

public static void swap(Employee x, Employee y){
    Employee temp = x;
    x = y;
    y = temp;
}

Employee a = new Employee("Alice");
Employee b = new Employee("Bob");
swap(a,b);
//執行完成後,a仍舊爲Alice,b爲Bob

方法並沒有改變存儲在變量a和b中的對象引用。swap交換的是兩個對象的引用的拷貝。而執行完畢後兩個拷貝x和y被直接丟棄,a和b仍舊指向原本的內存空間。

內存模型如下:
image

這說明,對象引用是 按值傳遞 的。

java中方法參數使用情況總結

  1. 一個方法不能修改一個基本數據類型的參數(即數值型或布爾型)。
  2. 一個方法可以改變一個對象參數的狀態。
  3. 一個方法不能讓對象參數引用一個新的對象。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章