這篇文章給大家介紹怎么理解Java的引用類型,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
為德宏州等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及德宏州網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、德宏州網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
為了形象起見,也為了打字方便,后面的內(nèi)容都把“引用類型的變量”稱為指針。所以,如果你原先有C/C++背景,今天講的內(nèi)容對(duì)你來說應(yīng)該很好理解;否則的話,可能要多琢磨琢磨了。
◆創(chuàng)建Java進(jìn)階問題
假設(shè)我們在函數(shù)中寫了如下這個(gè)簡單的語句:
StringBuffer str = new StringBuffer("Hello world"); |
別看這個(gè)語句簡單,其實(shí)包含了如下三個(gè)步驟:
首先,new StringBuffer("Hello world")在堆里申請(qǐng)了一坨內(nèi)存,把創(chuàng)建好的StringBuffer對(duì)象放進(jìn)去。
其次,StringBuffer str聲明了一個(gè)指針。這個(gè)指針本身是存儲(chǔ)在棧上的(因?yàn)檎Z句寫在函數(shù)中),可以用來指向某個(gè)StringBuffer類型的對(duì)象?;蛘邠Q一種說法,這個(gè)指針可以用來保存某個(gè)StringBuffer對(duì)象的地址。
***,當(dāng)中這個(gè)等于號(hào)(賦值符號(hào))把兩者關(guān)聯(lián)起來,也就是把剛申請(qǐng)的那一坨內(nèi)存的地址保存成str的值。
◆引用對(duì)象之間的賦值、判相等
通過上述的圖解,大伙兒應(yīng)該明白指針變量和該指針變量指向的對(duì)象是一個(gè)什么關(guān)系了吧。
還是接著剛才的例子,再來看賦值的問題。對(duì)于如下語句:
StringBuffer str2 = str; |
這個(gè)賦值語句是啥意思捏?實(shí)際上就是把str的地址復(fù)制給str2,記住,是地址的復(fù)制,StringBuffer對(duì)象本身并沒有復(fù)制。所以兩個(gè)指針指向的是同一個(gè)東東。
再搞一張示意圖,如下(今天畫這些圖把我累壞了):
明白了賦值,判斷相等的問題(就是==操作符)也就簡單了。當(dāng)我們寫如下語句“if(str2 == str)”時(shí),只是判斷兩個(gè)指針的值(也就是對(duì)象的地址)是否相等,并不是判斷被指向的對(duì)象是否內(nèi)容相同。
實(shí)際上兩個(gè)指針的值相同,則肯定是指向同一個(gè)對(duì)象(所以對(duì)象內(nèi)容必定相同)。但是兩個(gè)內(nèi)容相同的對(duì)象,它們的地址可能不一樣(比如克隆出來的多個(gè)對(duì)象之間,地址就不同)。
◆final常量的問題
針對(duì)引用類型變量的final修飾符也是很多人搞混淆的地方。實(shí)際上final只是修飾指針的值(也就是限定指針保存的地址不能變)。至于該指針指向的對(duì)象,內(nèi)容是否能變,那就管不著了。所以,對(duì)于如下語句:
final StringBuffer strConst = new StringBuffer(); |
你可以修改它指向的對(duì)象的內(nèi)容,比如:
strConst.append(" "); |
但是不能修改它的值,比如:
strConst = null; |
◆傳參的問題
引用類型(在函數(shù)調(diào)用中)的傳參問題,是一個(gè)相當(dāng)扯的問題。有些書上說是傳值,有些書上說是傳引用。搞得Java程序員都快成神經(jīng)分裂了。所以,我們***來談一下“引用類型參數(shù)傳遞”的問題。
v還是拿剛才的例子,假設(shè)現(xiàn)在要把剛才創(chuàng)建的那一坨字符串打印出來,我們會(huì)使用如下語句:
System.out.println(str);這個(gè)語句又是什么意思捏?這時(shí)候就兩說了。
***種理解:可以認(rèn)為傳進(jìn)函數(shù)的是str這個(gè)指針,指針說白了就是一個(gè)地址的值,說得再白一點(diǎn),就是個(gè)整數(shù)。按照這種理解,就是傳值的方式。也就是說,參數(shù)傳遞的是指針本身,所以是傳值的。
第二種理解:可以認(rèn)為傳進(jìn)去的是StringBuffer對(duì)象,按照這種理解,就是傳引用方式了。因?yàn)槲覀兇_實(shí)是把對(duì)象的地址(也就是引用)給傳了進(jìn)去。
費(fèi)了這么多口水,其實(shí)不論是傳引用還是傳值,都可以講得通,關(guān)鍵取決于你是如何看待參數(shù)所傳遞的東西。這就好比量子力學(xué)中“光的波粒二象性”,如果你以粒子的方式去測量它,它看起來像粒子;如果你以波動(dòng)的方式去觀測它,它看起來像波動(dòng)。假如你不太懂量子力學(xué),前面這話當(dāng)我沒說 :-)
關(guān)于怎么理解Java的引用類型就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
分享文章:怎么理解Java的引用類型
地址分享:http://jinyejixie.com/article2/ggeooc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、關(guān)鍵詞優(yōu)化、外貿(mào)建站、標(biāo)簽優(yōu)化、云服務(wù)器、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
移動(dòng)網(wǎng)站建設(shè)知識(shí)