3C科技 娛樂遊戲 美食旅遊 時尚美妝 親子育兒 生活休閒 金融理財 健康運動 寰宇綜合

Zi 字媒體

2017-07-25T20:27:27+00:00
加入好友
(#)背景 最近收到以前學弟提出的疑問,就是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提供 原文連結

寫了 5860316篇文章,獲得 23313次喜歡
精彩推薦