详解 JAVA 建立对象 NEW

假设咱们在函数中写了以下这个简单的语句:html

  StringBuffer str = new StringBuffer("Hello world");程序员

  别看这个语句简单,其实包含了以下三个步骤:app

  首先,newStringBuffer("Helloworld")在堆里申请了一坨内存,把建立好的StringBuffer对象放进去。函数

  其次,StringBufferstr声明了一个指针。这个指针自己是存储在栈上的(由于语句写在函数中),能够用来指向某个StringBuffer类型的对象。或者换一种说法,这个指针能够用来保存某个StringBuffer对象的地址。url

  最后,当中这个等于号(赋值符号)把二者关联起来,也就是把刚申请的那一坨内存的地址保存成str的值。spa

详解 <wbr>JAVA <wbr>建立对象 <wbr>NEW
 

 

  引用对象之间的赋值、判相等指针

  经过上述的图解,大伙儿应该明白指针变量和该指针变量指向的对象是一个什么关系了吧。htm

  仍是接着刚才的例子,再来看赋值的问题。对于以下语句:对象

  StringBuffer str2 = str;blog

  这个赋值语句是啥意思捏?实际上就是把str的地址复制给str2,记住,是地址的复制,StringBuffer对象自己并无复制。因此两个指针指向的是同一个东东。

  再搞一张示意图,以下(今天画这些图把我累坏了):

详解 <wbr>JAVA <wbr>建立对象 <wbr>NEW
 

  实际上两个指针的值相同,则确定是指向同一个对象(因此对象内容一定相同)。可是两个内容相同的对象,它们的地址可能不同(好比克隆出来的多个对象之间,地址就不一样)。

 

final常量的问题

  针对引用类型变量的final修饰符也是不少人搞混淆的地方。实际上final只是修饰指针的值(也就是限定指针保存的地址不能变)。至于该指针指向的对象,内容是否能变,那就管不着了。因此,对于以下语句:

  final StringBuffer strConst = new StringBuffer();

  你能够修改它指向的对象的内容,好比:

  strConst.append(" ");

  可是不能修改它的值,好比:

  strConst = null;

  传参的问题

  引用类型(在函数调用中)的传参问题,是一个至关扯的问题。有些书上说是传值,有些书上说是传引用。搞得Java程序员都快成神经分裂了。因此,咱们最后来谈一下“引用类型参数传递”的问题。

  v仍是拿刚才的例子,假设如今要把刚才建立的那一坨字符串打印出来,咱们会使用以下语句:

  System.out.println(str);这个语句又是什么意思捏?这时候就两说了。

  第一种理解:能够认为传进函数的是str这个指针,指针说白了就是一个地址的值,说得再白一点,就是个整数。按照这种理解,就是传值的方式。也就是说,参数传递的是指针自己,因此是传值的。

  第二种理解:能够认为传进去的是StringBuffer对象,按照这种理解,就是传引用方式了。由于咱们确实是把对象的地址(也就是引用)给传了进去。

相关文章
相关标签/搜索