如何理解这到题目
输出时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之间的赋值为什么传递(指或指针),请详细说明?
如何理解这到题目
输出时a为多少?
StringBuffer a = new StringBuffer("I am a ");
StringBuffer b = a;
a.append("after append");
a = b;
System.out.println("a=" + a);
这道题你只要明白一点就行了:[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打印出的是一样的。
不知道楼主明白了没有。