本文总共1312个字,阅读需5分钟,全文加载时间:2.254s,本站综合其他专栏收录该内容! 字体大小:

文章导读:假设咱们在【函数中】写了如下这个简单的语句: StringBuffer str = new StringBuffer(\"Hello world\"); 别看这个语句简单,其实包含了如下三个步骤: 首先,new 操作符会在【堆】(Heap)里申请了一坨内存,把创……各位看官请向下阅读:

假设咱们在【函数中】写了如下这个简单的语句:

StringBuffer str = new StringBuffer(\"Hello world\"); 别看这个语句简单,其实包含了如下三个步骤:

首先,new 操作符会在【堆】(Heap)里申请了一坨内存,把创建好的 StringBuffer 对象放进去。

其次,StringBuffer str 声明了一个指针。这个指针本身是存储在【栈】(Stack)上的,用来指向某个 StringBuffer 类型的对象。或者换一种说法,这个指针可以用来保存某个 StringBuffer 对象的地址。

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

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

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

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

StringBuffer str2 = str; 这个赋值语句是啥意思捏?实际上就是把 str 的地址复制给 str2;记住,是地址的复制,StringBuffer 对象本身并【没有】复制。所以两个指针指向的是同一个东东。

再搞一张示意图,如下

明白了赋值,判断相等的问题(就是==操作符)也就简单了。当我们写如下语句时,只是判断两个指针的【值】(也就是对象的地址)是否相等,并【不是】判断“被指向的对象”是否内容相同。

if(str2 == str) 实际上两个指针的值相同,则肯定是指向同一个对象(所以对象内容必定相同)。但是两个内容相同的对象,它们的地址可能不一样(比如克隆出来的多个对象之间,地址就不同)。

★final 常量的问题

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

final StringBuffer strConst = new StringBuffer(); 你可以修改它指向的对象的【内容】,比如:

strConst.append(\"hello world\"); 但是【不能】修改它的【值】,比如:

strConst = null;

★传参的问题

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

还是拿刚才的例子,假设现在要把刚才创建的那一坨字符串打印出来,我们会使用如下语句:

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

第一种理解:

可以认为传进函数的是 str 这个指针,指针说白了就是一个地址的值,说得再白一点,就是个整数。按照这种理解,就是传值的方式。也就是说,参数传递的是指针本身,所以是传值的。

第二种理解:

可以认为传进去的是 StringBuffer 对象,按照这种理解,就是传引用方式了。因为我们确实是把对象的地址(也就是引用)给传了进去。

费了这么多口水,其实不论是“传引用”还是“传值”,都可以讲得通,关键取决于你是【如何看待】参数所传递的【东西】。

以上内容由优质教程资源合作伙伴 “鲸鱼办公” 整理编辑,如果对您有帮助欢迎转发分享!

你可能对这些文章感兴趣:

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注