Java參數是傳值還是傳引用可能很多人不清楚,來看看下面的例子。
打印結果:
交換前: 李雷 韓梅梅
交換後: 李雷 韓梅梅
感覺很奇怪,爲什麼結果沒有變化呢?
因爲Java方法在執行的過程中實際上是傳值。
大家知道employ_1的值實際上是Object1的地址,employ_2的值實際上爲Object2的地址
在具體的執行過程中,首先會將empoly_1的值複製一份付給x,這樣x就指向Object1對象了,同理,y就指向Object2對象了
在交換的過程中,實際上只是x和y進行了交換,employ_1與mploy_2實際上還是指向原來的對象,所以沒有發生變化。
可能會有人會有疑惑,看如下代碼:
結果如下:
更改name前: 李雷
更改name後: abc
有人覺得很奇怪,這個返回結果不就是說明,Java方法執行的時候傳的是引用嗎?因爲最後name變了,其實不然,Java方法執行的時候仍然是傳值。
因爲方法執行的時候,首先會把employ_1的值拷貝一份,然後賦值給x,賦值之後employ_1和x都同時指向一個對象,對x所指向的對象進行修改,也必然會導致employ_1所指向的對象發生變化。
總結:Java複製並傳遞了“引用”的值,而不是對象。因此,方法中對對象的計算是會起作用的,因爲引用指向了原來的對象。但是因爲方法中對象的引用是“副本”,所以對象交換就沒起作用。如圖1所示,交換動作只對方法中的引用副本起作用了,不影響方法外的引用。所以不好意思,方法被調用後,改變不了方法外的對象的引用。如果要對方法外的對象引用做交換,我們應該交換原始的引用,而不是它的副本。