public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b);
System.out.println(a + "," + b);
} static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y = x;
}
}请问为什么输出 AB,B 呢。。求详解。。
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b);
System.out.println(a + "," + b);
} static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y = x;
}
}请问为什么输出 AB,B 呢。。求详解。。
StringBuffer z = x.append(y);
System.out.println(z);
y = x;
}不知可不可以这么理解
x.append(y);
y = x;
}中x跟a指向同一个StringBuffer,y和b是指向同一个StringBuffer,y=x,只是将y的指向变为x和a指向的StringBuffer,并没有改变b的指向。
LZ先想一想,main方法的a,b和operate的x,y是相同的变量吗?想清楚你就知道了
每个方法有自己的栈,每个局部变量属于自己的方法栈
方法调用的时候,只是把a,b的值复制给x,y,也就是a,b的内存信息和x,y的内存信息一样,换句话说,就是a,b引用的对象和x,y引用的对象相同
所以
x.append(y);
让x引用的对象的内容追加一个y,而a和x引用相同的对象,所以相当于a也发生了变化
y=x
让y引用x所引用的对象,b和y是不同的变量,此时它们分别引用不同的变量,所以此时对y做任何操作也不会影响b
先是有两个StringBuffer对象 a和b
然后调用了oprate方法
调用的oprate临时创建了两个StringBuffer对象 x和y x拿了a对象的地址 y拿了b对象的地址
然后x.append(y);
也就是x对象调用了append()方法,变成了AB,x和a的地址都是一样的,所以调用的对象也都是同一个,也就是a对象变成了AB
然后y=x 是y对象赋上了x对象的地址
最后oprate方法结束 x和y对象释放 内存里还是只有a和b对象 然而a对象在 operate 方法中调用过 变成了AB 而b没有调用过 ~~~
于是 a和b的值 分别是 AB 和B