原文地址:http://blog.csdn.net/whmii/article/details/3363667java
變量賦值和參數傳遞是java中兩個容易讓人迷惑的問題。
對於原始類型(primitives type),java採用值傳遞,這很明顯。然而,當傳遞的參數類型是對象時,或者兩個對象的變量進行賦值時,問題就有些複雜,不少初學者對此感到迷惑。
實際上,當賦值或者傳遞參數的時候,Java採起的都是一種值傳遞。
在下面的代碼中,函數
當執行change(a1)時,JVM將a1複製一份傳遞給A的靜態函數change(A a)中的參數a,注意這裏a1和a都是對象的引用,而不是對象自己。因此,傳遞的是對象引用的複製品。從而a1和a變成同一個對象的兩個不一樣引用。所以,經過a1對對象的改變,和經過a對對象的改變,具備一樣的效果。打個比方,有一道帶有複雜無比的鎖的門(對象),這扇門有一把鑰匙(a1)。如今,另一我的會開此門(方法change()的定義),他有一把想象中的鑰匙(形參),但他沒有事實上的鑰匙。當此人須要開此門時,怎麼辦?他須要一把鑰匙,而主人傳給他的確實是一把鑰匙,只不過這把鑰匙是主人原先的鑰匙的複製品!而這個複製品顯然也能打開這扇複雜的門。
一樣,對於第13行的
a1=a2;
是這樣進行的:複製前,a1和a2分別是兩個不一樣對象的引用,當賦值時,a2的值賦給a1,結果a1的值和a2的值相等,a1變成a2所引用的對象的另外一個引用,即a1和a2變成同一個對象的引用,而這個對象是原先a2引用的對象。原先a1引用的對象則由於失去了全部的引用而被垃圾收集器處理掉!spa