溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么理解Java的引用類型

發(fā)布時間:2021-11-20 16:25:26 來源:億速云 閱讀:175 作者:柒染 欄目:編程語言

這篇文章給大家介紹怎么理解Java的引用類型,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

為了形象起見,也為了打字方便,后面的內(nèi)容都把“引用類型的變量”稱為指針。所以,如果你原先有C/C++背景,今天講的內(nèi)容對你來說應(yīng)該很好理解;否則的話,可能要多琢磨琢磨了。

◆創(chuàng)建Java進(jìn)階問題

假設(shè)我們在函數(shù)中寫了如下這個簡單的語句:

StringBuffer str = new StringBuffer("Hello world");

別看這個語句簡單,其實包含了如下三個步驟:

首先,new StringBuffer("Hello world")在堆里申請了一坨內(nèi)存,把創(chuàng)建好的StringBuffer對象放進(jìn)去。

其次,StringBuffer str聲明了一個指針。這個指針本身是存儲在棧上的(因為語句寫在函數(shù)中),可以用來指向某個StringBuffer類型的對象。或者換一種說法,這個指針可以用來保存某個StringBuffer對象的地址。

***,當(dāng)中這個等于號(賦值符號)把兩者關(guān)聯(lián)起來,也就是把剛申請的那一坨內(nèi)存的地址保存成str的值。

怎么理解Java的引用類型

◆引用對象之間的賦值、判相等

通過上述的圖解,大伙兒應(yīng)該明白指針變量和該指針變量指向的對象是一個什么關(guān)系了吧。

還是接著剛才的例子,再來看賦值的問題。對于如下語句:

StringBuffer str2 = str;

這個賦值語句是啥意思捏?實際上就是把str的地址復(fù)制給str2,記住,是地址的復(fù)制,StringBuffer對象本身并沒有復(fù)制。所以兩個指針指向的是同一個東東。

再搞一張示意圖,如下(今天畫這些圖把我累壞了):

怎么理解Java的引用類型

明白了賦值,判斷相等的問題(就是==操作符)也就簡單了。當(dāng)我們寫如下語句“if(str2 == str)”時,只是判斷兩個指針的值(也就是對象的地址)是否相等,并不是判斷被指向的對象是否內(nèi)容相同。

實際上兩個指針的值相同,則肯定是指向同一個對象(所以對象內(nèi)容必定相同)。但是兩個內(nèi)容相同的對象,它們的地址可能不一樣(比如克隆出來的多個對象之間,地址就不同)。

◆final常量的問題

針對引用類型變量的final修飾符也是很多人搞混淆的地方。實際上final只是修飾指針的值(也就是限定指針保存的地址不能變)。至于該指針指向的對象,內(nèi)容是否能變,那就管不著了。所以,對于如下語句:

final StringBuffer strConst = new StringBuffer();

你可以修改它指向的對象的內(nèi)容,比如:

strConst.append(" ");

但是不能修改它的值,比如:

strConst = null;

◆傳參的問題

引用類型(在函數(shù)調(diào)用中)的傳參問題,是一個相當(dāng)扯的問題。有些書上說是傳值,有些書上說是傳引用。搞得Java程序員都快成神經(jīng)分裂了。所以,我們***來談一下“引用類型參數(shù)傳遞”的問題。

v還是拿剛才的例子,假設(shè)現(xiàn)在要把剛才創(chuàng)建的那一坨字符串打印出來,我們會使用如下語句:

System.out.println(str);這個語句又是什么意思捏?這時候就兩說了。

***種理解:可以認(rèn)為傳進(jìn)函數(shù)的是str這個指針,指針說白了就是一個地址的值,說得再白一點,就是個整數(shù)。按照這種理解,就是傳值的方式。也就是說,參數(shù)傳遞的是指針本身,所以是傳值的。

第二種理解:可以認(rèn)為傳進(jìn)去的是StringBuffer對象,按照這種理解,就是傳引用方式了。因為我們確實是把對象的地址(也就是引用)給傳了進(jìn)去。

費了這么多口水,其實不論是傳引用還是傳值,都可以講得通,關(guān)鍵取決于你是如何看待參數(shù)所傳遞的東西。這就好比量子力學(xué)中“光的波粒二象性”,如果你以粒子的方式去測量它,它看起來像粒子;如果你以波動的方式去觀測它,它看起來像波動。假如你不太懂量子力學(xué),前面這話當(dāng)我沒說 :-)

關(guān)于怎么理解Java的引用類型就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI