关于数组引用的问题

杨六 2009-10-02 09:46:45
以下输出为什么是abc呢? sb=null这里有什么作用,为什么结果不是null这后的c,请大家指教下,谢谢!
StringBuffer sb = new StringBuffer("a");
StringBuffer[] sbs = new StringBuffer[]{sb, null};
sb.append("b");
sb=null;
sbs[0].append("c");
System.out.println(sbs[0]);System.out.println(sb);
...全文
140 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
杨六 2009-10-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wang12 的回复:]
StringBuffer sb = new StringBuffer("a"); (1)
StringBuffer[] sbs = new StringBuffer[]{sb, null}; (2)
sb.append("b"); (3)
sb=null; (4)
sbs[0].append("c"); (5)
System.out.println(sbs[0]);System.out.println(sb);(6)
首先要说明的一点是:对象属于引用类型。
(1)处在堆内存中声明了一个StringBuffer对象,然后使用在堆中声明的StringBuffer引用变量sb指向它。
(2)处你声明了一个存储StringBuffer类的对象数组sbs,sbs[0]= sb;sbs[1] = null;
sbs[0] = sb,这一句使得sbs[0]和sb同时指向了(1)处声明的StringBuffer("a");
(3)语句执行后StringBuffer对象中的内容为"ab";
(4)执行后,sb指向了null,等待垃圾回收,而此时sbs[0]的引用并没有发生变化,还是(1)处创建的那个StringBuffer对象。
(5)语句执行后,堆内存中的StringBuffer对象中的内容为"abc",也就是sbs[0]引用的StringBuffer对象的内容。
(6)语句执行后,当然打印出:"abc"。
[/Quote]嗯,谢谢,这个答案应该是比较规范的。我后来试了如下情况,输出结果为abc 123c 123c,正好验证了这个结果。再次感谢各位。
StringBuffer sb = new StringBuffer("a");
StringBuffer[] sbs = new StringBuffer[]{sb, null};
sb.append("b");//sb为引用类型,指向a的位置
sb = new StringBuffer("123");//sb重新指向另一个位置j
StringBuffer[] sbs1 = new StringBuffer[]{sb, null};

sb.append("c");
sbs[0].append("c");//sbs中的sb仍指向a的那个引用类型
System.out.println(sbs[0]);
System.out.println(sbs1[0]);
System.out.println(sb);
杨六 2009-10-02
  • 打赏
  • 举报
回复
通过以下例子的输出结果(abc 123)我大致明白了其中的道理,初始sb为相当于指向a的某一个内存地址,而sbs初始定义sbs[0]同样保存sb这个引用类型的初始地址,再后来sb = new StringBuffer("123")相当于sb本身重新指向了另一个内存地址,但这并不影响sbs中sb对应指向的那个地址,仍然为初始为a的那块。貌似这样理解就可以解释为什么会是这样的结果了。
StringBuffer sb = new StringBuffer("a");
StringBuffer[] sbs = new StringBuffer[]{sb, null};
sb.append("b");//sb为引用类型,指向a的位置
sb = new StringBuffer("123");//sb重新指向另一个位置
//sb.append("c");
sbs[0].append("c");//sbs中的sb仍指向a的那个引用类型
System.out.println(sbs[0]);
System.out.println(sb);
wang12 2009-10-02
  • 打赏
  • 举报
回复
StringBuffer sb = new StringBuffer("a"); (1)
StringBuffer[] sbs = new StringBuffer[]{sb, null}; (2)
sb.append("b"); (3)
sb=null; (4)
sbs[0].append("c"); (5)
System.out.println(sbs[0]);System.out.println(sb);(6)
首先要说明的一点是:对象属于引用类型。
(1)处在堆内存中声明了一个StringBuffer对象,然后使用在堆中声明的StringBuffer引用变量sb指向它。
(2)处你声明了一个存储StringBuffer类的对象数组sbs,sbs[0]= sb;sbs[1] = null;
sbs[0] = sb,这一句使得sbs[0]和sb同时指向了(1)处声明的StringBuffer("a");
(3)语句执行后StringBuffer对象中的内容为"ab";
(4)执行后,sb指向了null,等待垃圾回收,而此时sbs[0]的引用并没有发生变化,还是(1)处创建的那个StringBuffer对象。
(5)语句执行后,堆内存中的StringBuffer对象中的内容为"abc",也就是sbs[0]引用的StringBuffer对象的内容。
(6)语句执行后,当然打印出:"abc"。
杨六 2009-10-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 amdgaming 的回复:]
Java code
你没有看到 sbs[0].append("c");
这个sbs[0]正好是数组 sb啊,你在看下。
[/Quote]
以上输出结果分别为abc null。证明sbs[0]为abc,而sb为null。sbs[0]与sb真正的区别在哪呢?糊涂了
舷Kelvin 2009-10-02
  • 打赏
  • 举报
回复
StringBuffer[] sbs = new StringBuffer[]{sb, null};

这句过后,sbs[0]和sb这两个变量同时指向那个StringBuffer对象。

所以后来的操作都实现在同个对象上,输出任意一个变量实际执行的都是sb指向的那个StringBuffer对象的toString()
amdgaming 2009-10-02
  • 打赏
  • 举报
回复

你没有看到 sbs[0].append("c");
这个sbs[0]正好是数组 sb啊,你在看下。

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧