關于值傳遞和引用傳遞的問題,我想很多人剛開始學的時候都會很迷惑,特別是有些書的文學水平實在不敢恭維。
在此,我特在此對Java的傳值和傳址提出我自己的一個看法,也許讓你能對這個問題的理解起到幫助。
首先:值傳遞是很好理解的。比如:
public class test {
int a = 3;
public void plus(int b){
b = b+1;
}
public static void main(String args[])
{
test t = new test();
t.plus(t.a);
System.out.println(t.a);
}
}
輸出的結果是3.這就是值傳遞。其實我們可以這樣理解:
在plus(int b)函數里,int b是作為這個函數的一個局部變量,在調用這個函數的時候開始位這個變量的內存空間。當我把變量a傳給這個函數的時候,實際上是把a變量當時的值拷貝一個放到變量b的分配空間里,b = b+1;這句改變的只是函數的局部變量b的值,當調用結束的時候,變量b的作用范圍也就結束了,而你在什么時候修改了變量a的分配空間呢?當然是沒有啦(除非你理解成變量a的空間整個放進b的空間里:))
而所謂的引用傳遞,我覺得這個名次起的很混淆視聽。以我自己的理解,一切傳遞都是拷貝傳遞。因為對象的標識符代表的是對象的存儲地址,所以你把對象的標識符號傳遞給函數的時候,實際上是把對象地址的拷貝傳遞給了函數。雖然也是拷貝,但是2個地址拷貝都是指向一個地址的,所以如果在函數里修改了對象,那么也實際上就修改了原先的值.
歸根到底一句話:Java一切參數的傳遞都是拷貝傳遞!