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

一道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条)

相关推荐 更多相似问题