自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java新手進(jìn)階:細(xì)說(shuō)引用類(lèi)型

開(kāi)發(fā) 后端
在Java中,引用類(lèi)型的變量非常類(lèi)似于C/C++的指針。本文為新手進(jìn)階教程,為大家詳細(xì)介紹引用的類(lèi)型。

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

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

假設(shè)我們?cè)诤瘮?shù)中寫(xiě)了如下這個(gè)簡(jiǎn)單的語(yǔ)句:

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

別看這個(gè)語(yǔ)句簡(jiǎn)單,其實(shí)包含了如下三個(gè)步驟:  

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

其次,StringBuffer str聲明了一個(gè)指針。這個(gè)指針本身是存儲(chǔ)在棧上的(因?yàn)檎Z(yǔ)句寫(xiě)在函數(shù)中),可以用來(lái)指向某個(gè)StringBuffer類(lèi)型的對(duì)象。或者換一種說(shuō)法,這個(gè)指針可以用來(lái)保存某個(gè)StringBuffer對(duì)象的地址?! ?/P>

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

◆引用對(duì)象之間的賦值、判相等

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

還是接著剛才的例子,再來(lái)看賦值的問(wèn)題。對(duì)于如下語(yǔ)句:  

StringBuffer str2 = str;

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

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

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

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

◆final常量的問(wèn)題

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

final StringBuffer strConst = new StringBuffer();

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

strConst.append(" ");

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

strConst = null;

◆傳參的問(wèn)題

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

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

System.out.println(str);這個(gè)語(yǔ)句又是什么意思捏?這時(shí)候就兩說(shuō)了。  

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

第二種理解:可以認(rèn)為傳進(jìn)去的是StringBuffer對(duì)象,按照這種理解,就是傳引用方式了。因?yàn)槲覀兇_實(shí)是把對(duì)象的地址(也就是引用)給傳了進(jìn)去?! ?/P>

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

【編輯推薦】

  1. 在 Java 類(lèi)型中對(duì)稱設(shè)計(jì)的重要性
  2. Java社區(qū)對(duì)甲骨文收購(gòu)Sun一事的看法
  3. 甲骨文收購(gòu)Sun意在Java 成為企業(yè)市場(chǎng)蘋(píng)果
  4. IT職場(chǎng)培訓(xùn) 程序員Java面試中的32個(gè)陷阱
  5. 4月17日外電頭條:Java 7將向細(xì)顆粒并行化發(fā)展
責(zé)任編輯:王觀 來(lái)源: 中國(guó)IT實(shí)驗(yàn)
相關(guān)推薦

2021-03-08 09:00:00

Java編程內(nèi)存

2010-02-04 14:41:52

Android菜單類(lèi)型

2010-03-10 09:27:36

Linux鏈接文件類(lèi)型

2024-05-20 08:58:13

Java引用類(lèi)型垃圾回收器

2009-10-10 09:53:07

.NET值類(lèi)型

2009-08-14 17:09:48

C#引用類(lèi)型

2011-07-11 14:36:05

JAVA

2023-08-31 07:33:41

GopherCarolexcel

2009-08-19 16:39:44

C#值類(lèi)型C#引用類(lèi)型

2009-08-26 14:05:19

C#值類(lèi)型和引用類(lèi)型

2010-01-05 12:26:08

三層交換機(jī)基本特點(diǎn)

2021-08-27 07:47:06

引用類(lèi)型

2009-09-11 11:09:36

C#引用類(lèi)型

2009-08-03 17:51:43

C#引用類(lèi)型

2009-09-11 11:17:04

C#引用類(lèi)型

2009-08-27 16:39:26

C# String類(lèi)型

2021-10-18 15:50:49

Android強(qiáng)引用軟引用

2009-12-03 09:59:20

JVM概念Java對(duì)象引用類(lèi)型

2009-08-06 10:14:15

C#引用類(lèi)型數(shù)組

2009-09-03 16:55:58

C#引用類(lèi)型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)