假設(shè)我們?cè)诤瘮?shù)中寫了如下這個(gè)簡(jiǎn)單的語(yǔ)句:
StringBuffer str = new StringBuffer("Hello world");
別看這個(gè)語(yǔ)句簡(jiǎn)單,其實(shí)包含了如下三個(gè)步驟:
首先,newStringBuffer("Helloworld")在堆里申請(qǐng)了一坨內(nèi)存,把創(chuàng)建好的StringBuffer對(duì)象放進(jìn)去。
其次,StringBufferstr聲明了一個(gè)指針。這個(gè)指針本身是存儲(chǔ)在棧上的(因?yàn)檎Z(yǔ)句寫在函數(shù)中),可以用來(lái)指向某個(gè)StringBuffer類型的對(duì)象。或者換一種說(shuō)法,這個(gè)指針可以用來(lái)保存某個(gè)StringBuffer對(duì)象的地址。
最后,當(dāng)中這個(gè)等于號(hào)(賦值符號(hào))把兩者關(guān)聯(lián)起來(lái),也就是把剛申請(qǐng)的那一坨內(nèi)存的地址保存成str的值。
|
|
|
|
<wbr><a target="_blank"><img src="http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif" name="image_operate_1241321971962955" alt="詳解<wbr>JAVA<wbr>創(chuàng)建對(duì)象<wbr>NEW" title="詳解<wbr>JAVA<wbr>創(chuàng)建對(duì)象<wbr>NEW" height="315" width="400"></a><br><br><a target="_blank"></a><br><br><center> <table align="center" border="0" cellpadding="1" cellspacing="4"><tbody> <tr> <td align="center" valign="top"><strong><img src="http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif" alt="詳解<wbr>JAVA<wbr>創(chuàng)建對(duì)象<wbr>NEW" title="詳解<wbr>JAVA<wbr>創(chuàng)建對(duì)象<wbr>NEW" border="1" height="315" width="400"></strong></td> </tr> <tr> <td align="center" valign="top"></td> </tr> </tbody></table> </center> <strong>引用對(duì)象之間的賦值、判相等</strong> <p> 通過上述的圖解,大伙兒應(yīng)該明白指針變量和該指針變量指向的對(duì)象是一個(gè)什么關(guān)系了吧。</p> <p> 還是接著剛才的例子,再來(lái)看賦值的問題。對(duì)于如下語(yǔ)句:</p> <p> StringBuffer str2 = str;</p> <p> 這個(gè)賦值語(yǔ)句是啥意思捏?實(shí)際上就是把str的地址復(fù)制給str2,記住,是地址的復(fù)制,StringBuffer對(duì)象本身并沒有復(fù)制。所以兩個(gè)指針指向的是同一個(gè)東東。</p> <p> 再搞一張示意圖,如下(今天畫這些圖把我累壞了):</p> <p><a target="_blank"><img src="http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif" alt="詳解<wbr>JAVA<wbr>創(chuàng)建對(duì)象<wbr>NEW" title="詳解<wbr>JAVA<wbr>創(chuàng)建對(duì)象<wbr>NEW"></a><br><br></p> <center> <table align="center" border="0" cellpadding="1" cellspacing="4"><tbody> <tr> <td align="center" valign="top"><strong><img src="http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif" alt="詳解<wbr>JAVA<wbr>創(chuàng)建對(duì)象<wbr>NEW" title="詳解<wbr>JAVA<wbr>創(chuàng)建對(duì)象<wbr>NEW" border="1" height="308" width="400"></strong></td> </tr> <tr> <td align="center" valign="top"></td> </tr> </tbody></table> </center> <p> 實(shí)際上兩個(gè)指針的值相同,則肯定是指向同一個(gè)對(duì)象(所以對(duì)象內(nèi)容必定相同)。但是兩個(gè)內(nèi)容相同的對(duì)象,它們的地址可能不一樣(比如克隆出來(lái)的多個(gè)對(duì)象之間,地址就不同)。</p> <p><wbr></wbr></p> <p><wbr></wbr></p> <p><strong>final常量的問題</strong></p> <p> 針對(duì)引用類型變量的final修飾符也是很多人搞混淆的地方。實(shí)際上final只是修飾指針的值(也就是限定指針保存的地址不能變)。至于該指針指向的對(duì)象,內(nèi)容是否能變,那就管不著了。所以,對(duì)于如下語(yǔ)句:</p> <p> final StringBuffer strConst = new StringBuffer();</p> <p> 你可以修改它指向的對(duì)象的內(nèi)容,比如:</p> <p> strConst.append(" ");</p> <p> 但是不能修改它的值,比如:</p> <p> strConst = null;</p> <p> <strong>傳參的問題</strong></p> <p> 引用類型(在函數(shù)調(diào)用中)的傳參問題,是一個(gè)相當(dāng)扯的問題。有些書上說(shuō)是傳值,有些書上說(shuō)是傳引用。搞得Java程序員都快成神經(jīng)分裂了。所以,我們最后來(lái)談一下“引用類型參數(shù)傳遞”的問題。</p> <p> v還是拿剛才的例子,假設(shè)現(xiàn)在要把剛才創(chuàng)建的那一坨字符串打印出來(lái),我們會(huì)使用如下語(yǔ)句:</p> <p> System.out.println(str);這個(gè)語(yǔ)句又是什么意思捏?這時(shí)候就兩說(shuō)了。</p> <p> 第一種理解:可以認(rèn)為傳進(jìn)函數(shù)的是str這個(gè)指針,指針說(shuō)白了就是一個(gè)地址的值,說(shuō)得再白一點(diǎn),就是個(gè)整數(shù)。按照這種理解,就是傳值的方式。也就是說(shuō),參數(shù)傳遞的是指針本身,所以是傳值的。</p> <p> 第二種理解:可以認(rèn)為傳進(jìn)去的是StringBuffer對(duì)象,按照這種理解,就是傳引用方式了。因?yàn)槲覀兇_實(shí)是把對(duì)象的地址(也就是引用)給傳了進(jìn)去。</p> </wbr>