Java是傳值還是傳引用問題

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所示,交換動作只對方法中的引用副本起作用了,不影響方法外的引用。所以不好意思,方法被調用後,改變不了方法外的對象的引用。如果要對方法外的對象引用做交換,我們應該交換原始的引用,而不是它的副本。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章