Java新手進階:細說參考型別

來源:互聯網
上載者:User
  在前幾天的文章“Java效能最佳化[1]:基本類型 vs 參考型別

”裡,大概介紹了參考型別和基本類型在儲存上的區別。昨天有網友在評論中批評說“參考型別變數和它所引用的對象”沒區分清楚,容易混淆。所以今天專門來說一下參考型別的相關細節。另外,也把原先的文章
中,關於“兩種類型的儲存方式”這節修改了一下,加點插圖,有助於大伙兒的理解。

  其實,參考型別的變數非常類似於C/C++的指標。為了形象起見,也為了打字方便,本文後面的內容,都把“參考型別的變數”稱為指標

。所以,如果你原先有C/C++背景,今天講的內容對你來說應該很好理解;否則的話,可能要多琢磨琢磨了。

  ★建立問題

  假設我們在函數中

寫了如下這個簡單的語句:
StringBuffer str = new StringBuffer("Hello world");

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

  首先,new StringBuffer("Hello world")

裡申請了一坨記憶體,把建立好的StringBuffer對象放進去。

  其次,StringBuffer str

聲明了一個指標。這個指標本身是儲存在

上的(因為語句寫在函數中
),可以用來指向某個StringBuffer類型的對象。或者換一種說法,這個指標可以用來儲存某個StringBuffer對象的地址。

  最後,當中這個等號

(賦值符號)把兩者關聯起來,也就是把剛申請的那一坨記憶體的地址儲存成str的值。

  把上次文章
的圖片再拿出來秀一下:

 

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

  通過上述的圖解,大伙兒應該明白指標變數和該指標變數指向的對象

是一個什麼關係了吧。

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

  StringBuffer str2 = str;

  這個指派陳述式是啥意思捏?實際上就是把str的地址複製給str2,記住,是地址的複製,StringBuffer對象本身並沒有複製。所以兩個指標指向的是同一個東東。

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

  明白了賦值,判斷相等的問題(就是==操作符)也就簡單了。當我們寫如下語句“if(str2 == str)

”時,只是判斷兩個指標的

(也就是對象的地址)是否相等,並不是判斷被指向的對象
是否內容相同。

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

  ★final常量的問題

  針對參考型別變數的final修飾符也是很多人搞混淆的地方。實際上final只是修飾指標的值(也就是限定指標儲存的地址不能變)。至於該指標指向的對象,內容是否能變,那就管不著了。所以,對於如下語句:

  final StringBuffer strConst = new StringBuffer();

  你可以修改它指向的對象的內容,比如:

  strConst.append(" ");

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

  strConst = null;

  ★傳參的問題

  參考型別(在函數調用中)的傳參問題,是一個相當扯的問題。有些書上說是傳值,有些書上說是傳引用。搞得Java程式員都快成神經分裂了。所以,我們最後來談一下“參考型別參數傳遞”的問題。

  還是拿剛才的例子,假設現在要把剛才建立的那一坨字串列印出來,我們會使用如下語句:
System.out.println(str);

這個語句又是什麼意思捏?這時候就兩說了。

  第一種理解:

可以認為傳進函數的是str這個指標,指標說白了就是一個地址的值,說得再白一點,就是個整數。按照這種理解,就是傳值的方式。也就是說,參數傳遞的是指標本身,所以是傳值的。

  第二種理解:

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

  費了這麼多口水,其實不論是傳引用
還是傳值

,都可以講得通,關鍵取決於你是如何看待
參數所傳遞的東西

。這就好比量子力學中“光的波粒二象性”,如果你以粒子的方式去測量它,它看起來像粒子;如果你以波動的方式去觀測它,它看起來像波動。假如你不太懂量子力學,前面這話當我沒說


著作權聲明

本部落格所有的原創文章,作者皆保留著作權。轉載必須包含本聲明,保持本文完整,並以超連結形式註明作者編程隨想
和本文原始地址:

 

http://program-think.blogspot.com/2009/03/java-reference-types-detail.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.