假设我们在函数中写了如下这个简单的语句:
<wbr><a href="http://photo.blog.sina.com.cn/showpic.html#blogid=8cfbb9920100z8ec&url=http://s12.sinaimg.cn/orignal/8cfbb992hb253927c1b0b" target="_blank"><img src="http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif" name="image_operate_1241321971962955" alt="详解<wbr>JAVA<wbr>创建对象<wbr>NEW" title="详解<wbr>JAVA<wbr>创建对象<wbr>NEW" height="315" width="400"></a><br><br><a href="http://photo.blog.sina.com.cn/showpic.html#blogid=8cfbb9920100z8ec&url=http://s11.sinaimg.cn/orignal/8cfbb992hb25392b7cd5a" 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>创建对象<wbr>NEW" title="详解<wbr>JAVA<wbr>创建对象<wbr>NEW" border="1" height="315" width="400"></strong></td> </tr> <tr> <td align="center" valign="top"></td> </tr> </tbody></table> </center> <strong>引用对象之间的赋值、判相等</strong> <p> 通过上述的图解,大伙儿应该明白指针变量和该指针变量指向的对象是一个什么关系了吧。</p> <p> 还是接着刚才的例子,再来看赋值的问题。对于如下语句:</p> <p> StringBuffer str2 = str;</p> <p> 这个赋值语句是啥意思捏?实际上就是把str的地址复制给str2,记住,是地址的复制,StringBuffer对象本身并没有复制。所以两个指针指向的是同一个东东。</p> <p> 再搞一张示意图,如下(今天画这些图把我累坏了):</p> <p><a href="http://photo.blog.sina.com.cn/showpic.html#blogid=8cfbb9920100z8ec&url=http://s11.sinaimg.cn/orignal/8cfbb992hb25396663bea" target="_blank"><img src="http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif" alt="详解<wbr>JAVA<wbr>创建对象<wbr>NEW" title="详解<wbr>JAVA<wbr>创建对象<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>创建对象<wbr>NEW" title="详解<wbr>JAVA<wbr>创建对象<wbr>NEW" border="1" height="308" width="400"></strong></td> </tr> <tr> <td align="center" valign="top"></td> </tr> </tbody></table> </center> <p> 实际上两个指针的值相同,则肯定是指向同一个对象(所以对象内容必定相同)。但是两个内容相同的对象,它们的地址可能不一样(比如克隆出来的多个对象之间,地址就不同)。</p> <p><wbr></wbr></p> <p><wbr></wbr></p> <p><strong>final常量的问题</strong></p> <p> 针对引用类型变量的final修饰符也是很多人搞混淆的地方。实际上final只是修饰指针的值(也就是限定指针保存的地址不能变)。至于该指针指向的对象,内容是否能变,那就管不着了。所以,对于如下语句:</p> <p> final StringBuffer strConst = new StringBuffer();</p> <p> 你可以修改它指向的对象的内容,比如:</p> <p> strConst.append(" ");</p> <p> 但是不能修改它的值,比如:</p> <p> strConst = null;</p> <p> <strong>传参的问题</strong></p> <p> 引用类型(在函数调用中)的传参问题,是一个相当扯的问题。有些书上说是传值,有些书上说是传引用。搞得Java程序员都快成神经分裂了。所以,我们最后来谈一下“引用类型参数传递”的问题。</p> <p> v还是拿刚才的例子,假设现在要把刚才创建的那一坨字符串打印出来,我们会使用如下语句:</p> <p> System.out.println(str);这个语句又是什么意思捏?这时候就两说了。</p> <p> 第一种理解:可以认为传进函数的是str这个指针,指针说白了就是一个地址的值,说得再白一点,就是个整数。按照这种理解,就是传值的方式。也就是说,参数传递的是指针本身,所以是传值的。</p> <p> 第二种理解:可以认为传进去的是StringBuffer对象,按照这种理解,就是传引用方式了。因为我们确实是把对象的地址(也就是引用)给传了进去。</p> </wbr>
StringBuffer str = new StringBuffer("Hello world");
别看这个语句简单,其实包含了如下三个步骤:
首先,newStringBuffer("Helloworld")在堆里申请了一坨内存,把创建好的StringBuffer对象放进去。
其次,StringBufferstr声明了一个指针。这个指针本身是存储在栈上的(因为语句写在函数中),可以用来指向某个StringBuffer类型的对象。或者换一种说法,这个指针可以用来保存某个StringBuffer对象的地址。
最后,当中这个等于号(赋值符号)把两者关联起来,也就是把刚申请的那一坨内存的地址保存成str的值。