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