摘要:傳值和傳址有什么區別是傳值還是傳址開始在傳參時,是傳值還是傳址傳值和傳址假設要將傳到。傳值和傳址是傳值是傳值。分別是基本類型,對象和數組,還有。常量池時,好比是一張紙條,當要傳值給時,事實是把紙條上的內容抄給了。
傳值和傳址有什么區別?Java是傳值還是傳址?
開始
Java在傳參時,是傳值還是傳址?
傳值和傳址
假設要將A傳到B。如果是傳值,就意味著將A中存放的值復制一份給B,B存的是跟A一樣的值,B的改變,不會影響到A。如果是傳址,則是將A的地址復制給B,改變B時,事實上會根據B中存放的地址找到A,所以,B的改變,也就代表A的改變。
傳值和傳址
Java是傳值
java是傳值。首先,你要明確這個概念,然后,我們來看看,為什么這樣說?
在java中,沒有指針這個概念。傳參時,確實是將A的值復制了一份到B,B的改變并不會影響A中的值。說到這里,同學就該疑惑了,說這怎么可能呢?沒關系,我們繼續往下聊。
分三種情況來討論這個問題。分別是基本類型,對象和數組,還有String。
我們假設有數據V,賦值給變量A,要傳參到變量B。
基本類型
先來看基本類型。假設V是一個基本類型,那么,A中存放的就是數據V本身。此時,復制一份到B,意味著B中也存儲了數據V1。注意,這里特別注明V1,代表的是V和V1的值相同,它們是同樣的值,但不是同一個值。所以,對B的操作,不會影響到A,這是比較容易理解的。
對象和數組
再來看對象和數組。假設V是一個對象或數組,那么,A中存放的就是數據V在堆中的地址(V也可以存放在其它內存空間中),我們稱之為引用類型。此時,復制一份到B,意味著B中也存儲了數據V的地址。注意,這里,A和B中的值確實也是一樣的,但是,不是同一個值。那么,接下來我們對B操作,看看會發生什么。我們分兩種情況來討論。寶寶起名寶典
第一種情況,我們假設修改了對象V的某個屬性或數組中的某個元素。此時,實際上做的是,根據B中存儲的值,找到對應的地址,修改了對應地址中的值。這樣,由于A和B存儲的是同樣的地址,所以,當再通過A去獲取對應地址中的值時,就會發現,A變量也改變了。
第二種情況,我們創建了一個新的對象或數組,并將其賦值給B。那么,此時A會改變嗎?我們說,不會,因為A和B原來只是存儲了同樣的值,并不是同一個值,所以,修改了B中的值,并不會影響到A,A還是指向它原來指向的對象。總結一下就是,當修改B本身的值時,不會影響A,當修改的是B中地址對應的對象或數組時,會影響到A。
String常量池
最后,我們來看String。我們知道,String并不是一個基本類型,那么,它是不是應該和對象或數組的特性一樣呢?不是,因為String用了一個特殊的機制,叫做常量池。當你新建一個String對象(通過字面量的方式)時,事實上,JVM真正做的是,在常量池中找對應的值,找到就把地址給變量,找不到,就在常量池中新建一個值,再把地址給變量。這里,有兩層含義。
第一, 如下,a和b存儲的實際是同樣的常量池地址。
第二, a中存儲的地址已經改變了,但是,常量池中,原先存放hello的位置中的值,還是沒有改變,JVM會在常量池中重新找一個地方,存放hello world,并把地址給a。
所以,當把A傳給B時,通過字面量的方式修改B的值,事實上不會對A造成影響。而如果是通過new的方式,新建一個String對象賦值給B,那就和對象或數組的情形一樣了,一會對A造成影響。
舉個栗子
基本類型時,A好比是一張紙條,當要傳值給B時,事實是把紙條上的內容抄給了B,所以,B去修改自己紙條上的內容,當然不會對A產生任何影響。
引用類型時,A好比是一把倉庫鑰匙,當要傳值給B時,事實上是把鑰匙配了一把給B。B把自己鑰匙扔掉,或者是盤幾年,包漿了,都不會對A產生影響,但是,B如果拿著鑰匙打開倉庫,把倉庫里的東西都賣了,那當A打開倉庫時,自然就會嚇得一屁股坐到了地上。
常量池時,A好比是一張紙條,當要傳值給B時,事實是把紙條上的內容抄給了B。聽起來好像和基本類型是一樣的,其實不然。因為紙條上寫的是一個字典上對應的頁碼。當B修改自己的紙條時,當然不會對A有影響。而當B修改字典上對應頁碼的內容時,事實上,B是不能這么干的。字典有防御功能,它會在字典中找到B需要的值,把相應的頁碼給B。所以,這也不會對A造成影響。
結論
Java是傳值,基本類型時,復制的是值,引用類型時,復制的是引用,也就是地址。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75253.html
摘要:結尾有關這四道經典的指針筆試題講解就到此結束了,如果覺得文章對自己有所幫助,歡迎大家多多點贊收藏 ?前言 : 今天博主來講解4道經典的指針筆試題,很多朋友沒有深刻理...
摘要:深拷貝淺拷貝本文主要對深拷貝淺拷貝的解釋及實現做一下簡單記錄。之所以會有深拷貝與淺拷貝之分,是因為不同數據類型的數據在內存中的存儲區域不一樣。但注意,只能做一層屬性的淺拷貝。 深拷貝VS淺拷貝 本文主要對深拷貝&淺拷貝的解釋及實現做一下簡單記錄。原文鏈接,歡迎star。 之所以會有深拷貝與淺拷貝之分,是因為不同數據類型的數據在內存中的存儲區域不一樣。 堆和棧是計算機中劃分出來用來存儲的...
摘要:接下來我們進入正片數據類型六種基本數據類型布爾值,和一個表明值的特殊關鍵字。一種數據類型,它的實例是唯一且不可改變的。在中是沒有方法是可以改變布爾值和數字的。參考資料深拷貝淺拷貝 前言 筆者最近整理了一些前端技術文章,如果有興趣可以參考這里:muwoo blogs。接下來我們進入正片: js 數據類型 六種 基本數據類型: Boolean. 布爾值,true 和 false. nu...
閱讀 3117·2021-11-23 09:51
閱讀 1981·2021-09-09 09:32
閱讀 1090·2019-08-30 15:53
閱讀 2964·2019-08-30 11:19
閱讀 2473·2019-08-29 14:15
閱讀 1440·2019-08-29 13:52
閱讀 558·2019-08-29 12:46
閱讀 2824·2019-08-26 12:18