引用类型的变量十分相似于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对象本身并没有复制。所以两个指针指向的是同一个东东。 再搞一张表示图,如下(明天画这些图把我累坏了): 明白了赋值,
意大利tincoco判别相等的成果(就是==操作符)也就复杂了。当我们写如下语句“if(str2 == str)”时,只是判别两个指针的值(也就是对象的地址)是否相等,并不是判别被指向的对象是否内容相同。 实际上两个指针的值相同,则一定是指向同一个对象(所以对象内容肯定相同)。但是两个内容相同的对象,它们的地址可能不一样(比如克隆出来的多个对象之间,地址就不同)。