先解釋一下分別是什么意思吸奴,
????值傳遞:作為參數(shù)傳遞時只傳遞了值斩狱,參數(shù)本身沒有傳遞网沾,如果被傳遞的方法改變傳遞后的變量參數(shù)值心软,原變量不會改變壕吹。在JAVA中顯式的值傳遞參數(shù)是各類型變量例如: int double char String Integer 等都是。
? ? 引用傳遞: 作為參數(shù)傳遞時傳遞的是參數(shù)本身删铃,當(dāng)被傳遞方法改變傳遞后的變量參數(shù)值耳贬,原參數(shù)也會發(fā)生改變。一般來說我們自定義的類基本都屬于這種情況猎唁,那么為什么String類型變量本質(zhì)也是對象但是沒有出現(xiàn)這種情況咒劲,這個后邊會詳細解釋。
注意:在C語言里有引用傳遞這種說法诫隅,但是在JAVA里雖然有類似效果但是實質(zhì)上不存在任何引用傳遞腐魂,我們看到的類似引用傳遞的效果本質(zhì)上還是值傳遞,原因下邊慢慢看逐纬。
????堆 & 棧 的定義在之前已經(jīng)說過蛔屹,那么這里說一下,基本類型變量 int boolean char float double等這些基本類型在定義后其數(shù)據(jù)是存在棧里這里說過风题,那么基本類型變量傳遞的時候是只傳遞了一個值判导,新變量本身除了值和原型一致就沒有任何其他關(guān)系嫉父,所以基本類型變量傳遞是值傳遞。(注意雖然java是面向?qū)ο缶幊萄廴校腔绢愋妥兞坎皇菍ο螅〝?shù)組是對象)绕辖,為了解決這個問題有了封裝類。)
? ? 那么String Integer這些封裝類型呢擂红?我們將 str傳遞過去實際上相當(dāng)于 String str=“呵呵”仪际; String st=str;那么傳遞的時候這里注意了,這里傳遞的時“地址”這個值昵骤,所以 st=str 只是將str所指向的地址賦值給st树碱,按理說既然是st和str公用一個地址那么當(dāng)st改變時str也應(yīng)該改版對吧,那么為什么原變量str無改變呢变秦。這里涉及到String 及 Integr 等封裝類的源代碼成榜,看下Stirng的源代碼
????發(fā)現(xiàn)沒,這里value是final常量不可改的蹦玫,而且在源代碼里沒有set方法赎婚,也就意味著不能一旦定義不能修改值,那么也就意味著平時我們修改值實際上是相當(dāng)于在堆里新劃分出了一塊空間樱溉,創(chuàng)建了一個新的String對象挣输,然后修改變量的指向使其指向新對象,所以值改變了福贞。
? ? 但是我們平時定義類的時候很少講成員變量定義為final并且不設(shè)定set方法撩嚼,所以我們自定義類傳遞時傳遞的是堆的指向也就地址,并且成員變量是可改的那么這時效果是引用傳遞效果(雖然本質(zhì)是值傳遞)挖帘。
這里有個鏈接也可以看下完丽,很詳細的https://blog.csdn.net/wabiaozia/article/details/52492557