search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

Java是傳值還是傳引用?

(#)背景

最近收到以前學弟提出的疑問,就是java到底傳的是引用還是值(按他的說法形參和實參),其實本來不像解釋的,因為我覺得這是一個很簡單的概念,當你看見的東西解釋

不了的時候,你應該做的就是這些數據在java內存中的表現是什麼呢,所以我給他的建議就是去看看這些在內存中都是什麼樣的,今天來自己解釋一下吧

(#)例子

看了上面的小例子,首先你會覺得這個到底傳的是什麼呢?值好像也不全是,引用好像也解釋不了,其實這個時候就很簡單了,我們分析一下二者內存結構,

(1)對於int這種基本類型,我們知道它的存儲模型是這樣的,比如int a=0,是直接存儲在棧裡面的,而當我們調用t1的時候,發生的是什麼呢?

會在棧中直接把a,b的值賦值給方法中使用的變數a,b,那麼很明顯你修改的a,b和main方法中的a,b並沒有什麼關係,這是第一種情況的原因

(2)對於String 類型,首先要說的就是String類型不是基本類型,那麼我們String str="123"的時候,內存中發生了什麼呢?來看看

那麼我們調用t2方法的時候,發生了什麼呢,傳遞的是值嘛,那就很簡單,我們直接把存儲的值傳進去了,而值是什麼?很容易明白了吧

那麼str="java"的時候發生了什麼呢?

沒錯,str="java"其實相當於str=new String("java"),那麼我們其實是在堆中重新分配了內存的,然後引用重新指向了新分配的內存,所以當然不影響外面了

(3)而同理對於t3方法,我們傳進去的也是值,但是這個值就是在棧中存儲的地址,流程圖如下

那麼剩下來的就很好理解了,修改生效的原因就是因為二者指向了同一塊堆內存,所以修改是正常的,那麼舉個例子,如果我在t3中再寫一行當代,

t=new TestUrl;這樣會影響到testUrl嗎???想一想如果你能很快的想到內存中的樣子,其實就明白java只傳值,這句話是什麼意思了



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦