一些術語的解釋
- 按值調用:表示方法接收的是調用者提供的值。即方法的得到的是變量的一份拷貝,而非原本的變量。
- 按引用調用:表示方法接收的是調用者提供的變量地址。方法的得到的是原本的變量的引用。
一個方法可以修改 按引用調用 傳入的變量值,而不可以修改 按值調用 傳入的變量值。
在java中,總是 按值調用,即方法得到的總是所有參數值的一個拷貝,無法修改原本變量的內容。
所以,在java中,一個方法不可能修改一個基本數據類型的參數。但是將對象作爲參數就可以實現這一操作。
例如:
對一個基本數據類型的變量進行操作:
public static void tripleValue(int a){
a = a * 3;
}
int a = 10;
tripleValue(a);
並不會改變a的值。內存示意圖如下:
變量被進行了複製操作。
而對對象進行操作就不同了:
public static void tripleValue(NumContent a){
a.tripleIt();
}
a = new NumContent();
tripleValue(a);
內存模型如下:
可以看到,這裏被複制的是對象的引用,但是仍舊指向原本的內存地址。
然而,這並不意味着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仍舊指向原本的內存空間。
內存模型如下:
這說明,對象引用是 按值傳遞 的。
java中方法參數使用情況總結
- 一個方法不能修改一個基本數據類型的參數(即數值型或布爾型)。
- 一個方法可以改變一個對象參數的狀態。
- 一個方法不能讓對象參數引用一個新的對象。