public class Foo { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuffer a =new StringBuffer("pccw");
StringBuffer b =new StringBuffer("solutions");
operate(a,b);
System.out.println(a+","+b);
}
static void operate(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
}
}
该程序的结果是什么?
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuffer a =new StringBuffer("pccw");
StringBuffer b =new StringBuffer("solutions");
operate(a,b);
System.out.println(a+","+b);
}
static void operate(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
}
}
该程序的结果是什么?
static void operate(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
}
operate(a,b);方法,只是将a,b的副本传给了operate方法。
在方法内部并没有修改a和b的值,只是对a和b的副本在操作。不会影响到a和b的值
使用了append之后就改变了对象的引用
但是直接=的话么有改变
1楼的答案是对的
StringBuffer a =new StringBuffer("pccw");
StringBuffer b =new StringBuffer("solutions");
// 1: a指向对象"pccw", b指向对象"solutions" (我这里就简写了,看得懂就行)
operate(a,b);
// 2: 调用operate方法,跳到下面
System.out.println(a+","+b);
// 8: 于是输出"pccwsolutions,solutions"
}
static void operate(StringBuffer x,StringBuffer y){
// 3: 参数传进,由于传递的是地址,于是x也指向"pccw",y也指向"solutions"
x.append(y);
// 4: 调用StringBuffer的方法,那么x指向的对象"pccw"就变成了"pccwsolutions"
y=x;
// 5: y=x,将x的值赋值给y,也即y指向了"pccwsolutions"
// 6: 但!这里的y和外面的b没有半毛钱关系!
// 7: 参数调用的时候,仅仅是将b的值赋值给y而已,这里的y的变化不影响外面的b
}
}
栈上在存储的是
StringBuffer x和
StringBuffer y两个对象引用的copy,也就是说a与x,b与y虽然都是指向同一个对象,但不是相同的引用,
因为java里面所有的传递都是值传递在operate方法里面,a指向的对象调用一个append方法,所以x所指向的对象发生了变化,b只是指向的对象发生变化的,因为b与y是不同的引用的,所以y没有发生变化的