假設咱們在函數中寫了以下這個簡單的語句:html
StringBuffer str = new StringBuffer("Hello world");程序員
別看這個語句簡單,其實包含了以下三個步驟:app
首先,newStringBuffer("Helloworld")在堆裏申請了一坨內存,把建立好的StringBuffer對象放進去。函數
其次,StringBufferstr聲明瞭一個指針。這個指針自己是存儲在棧上的(由於語句寫在函數中),能夠用來指向某個StringBuffer類型的對象。或者換一種說法,這個指針能夠用來保存某個StringBuffer對象的地址。url
最後,當中這個等於號(賦值符號)把二者關聯起來,也就是把剛申請的那一坨內存的地址保存成str的值。spa
![]() |
引用對象之間的賦值、判相等指針
經過上述的圖解,大夥兒應該明白指針變量和該指針變量指向的對象是一個什麼關係了吧。htm
仍是接着剛纔的例子,再來看賦值的問題。對於以下語句:對象
StringBuffer str2 = str;blog
這個賦值語句是啥意思捏?實際上就是把str的地址複製給str2,記住,是地址的複製,StringBuffer對象自己並無複製。因此兩個指針指向的是同一個東東。
再搞一張示意圖,以下(今天畫這些圖把我累壞了):
實際上兩個指針的值相同,則確定是指向同一個對象(因此對象內容一定相同)。可是兩個內容相同的對象,它們的地址可能不同(好比克隆出來的多個對象之間,地址就不一樣)。
final常量的問題
針對引用類型變量的final修飾符也是不少人搞混淆的地方。實際上final只是修飾指針的值(也就是限定指針保存的地址不能變)。至於該指針指向的對象,內容是否能變,那就管不着了。因此,對於以下語句:
final StringBuffer strConst = new StringBuffer();
你能夠修改它指向的對象的內容,好比:
strConst.append(" ");
可是不能修改它的值,好比:
strConst = null;
傳參的問題
引用類型(在函數調用中)的傳參問題,是一個至關扯的問題。有些書上說是傳值,有些書上說是傳引用。搞得Java程序員都快成神經分裂了。因此,咱們最後來談一下「引用類型參數傳遞」的問題。
v仍是拿剛纔的例子,假設如今要把剛纔建立的那一坨字符串打印出來,咱們會使用以下語句:
System.out.println(str);這個語句又是什麼意思捏?這時候就兩說了。
第一種理解:能夠認爲傳進函數的是str這個指針,指針說白了就是一個地址的值,說得再白一點,就是個整數。按照這種理解,就是傳值的方式。也就是說,參數傳遞的是指針自己,因此是傳值的。
第二種理解:能夠認爲傳進去的是StringBuffer對象,按照這種理解,就是傳引用方式了。由於咱們確實是把對象的地址(也就是引用)給傳了進去。