iteye_12562 2009-08-21 13:49
浏览 203
已采纳

一道JAVA基础面试题,如何理解?

如何理解这到题目

输出时a为多少?


StringBuffer a = new StringBuffer("I am a ");
StringBuffer b = a;
a.append("after append");
a = b;
System.out.println("a=" + a);


问题:
1、如果A输出值变了,说出为什么?
2、b=a, a=b之间的赋值为什么传递(指或指针),请详细说明?
  • 写回答

5条回答 默认 最新

  • walsh_bupt 2009-08-21 14:07
    关注

    这道题你只要明白一点就行了:[color=red]对象的引用是在栈上分配空间的,而对于任何对象都是在堆上分配空间的。[/color]

    还需要明白一点就是:[code="java"]在Java中应用变量就相当C中的指针,引用变量指向的是堆上的一个对象。[/code]

    而对于StringBuffer 就相当于一个字符串池;

    [code="java"]StringBuffer a = new StringBuffer("I am a ");

    StringBuffer b = a;

    a.append("after append");

    a = b;

    System.out.println("a=" + a); [/code]

    当执行第一行的时候,[color=red]在栈上分配了引用变量a,这个引用变量指向了字符号串池[/color]。

    此时字符串池里面存放的是:I am a

    当执行第二行的时候,[color=red]又在栈上分配了一个引用变量b,然后引用变量a赋值给b[/color],这条语句执行后的情况是:[color=red]引用变量a和引用变量b共同指向了字符串池。在这种情况下,通过任何一个引用变量都可以修改字符串池中的字符串。[/color]

    第三行语句,就像上面说的,是用引用变量a来修改字符串池中的字符串,当然这个时候,直接用引用变量b也可以直接修改,记住一点,通过a和b对池做的任何修改都会立即反应出来。

    当执行第四行语句的时候,[color=red]其实这个语句是迷惑人的[/color],无论a=b,或是b=a,效果是一样的,因为它们都指向的是字符串池。

    最后输出a,当然是修改后的内容了,当然了,在这个时候,打印b,结果是和a打印出的是一样的。

    不知道楼主明白了没有。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办