public class A {
public static void main(String args[]){
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
operate(a,b);
System.out.println(a+","+b);
}
private static void operate(StringBuffer a, StringBuffer b) {
// TODO Auto-generated method stub
a.append(b);
b=a;
}
}
大家觉得结果会是什么呢?求解释。
public static void main(String args[]){
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
operate(a,b);
System.out.println(a+","+b);
}
private static void operate(StringBuffer a, StringBuffer b) {
// TODO Auto-generated method stub
a.append(b);
b=a;
}
}
大家觉得结果会是什么呢?求解释。
StringBuffer b=new StringBuffer("B");这句中的b我用b1表示,operate方法中b我用b2表示。
当你调用operate(a,b),传递的是单元的地址。你将b1指向单元的地址传递给了operate方法中的b2
再operate方法中执行a.append(b);后,a指向的单元的内容就变成"AB"了,你再令b=a,这样b2中存放的指向单元的地址就变成和a中的地址一样了,也就是说b2不再指向以前存放"B"的单元了,而是指向存放"AB"的单元了。但请注意,此时b1中存放的指向单元的地址并没有改变,所以调用输出方法时输出b1的内容仍是"B".不知说的你明白不?
作用域仅仅是该方法内。嗯,把b=a放在main中,就是AB,AB引用不知道几楼的:
/operate方法中的b=a就没有意义了。一旦将a赋给b,那么b就和原来的传递的b对象没有了关系,当b=a;执行结束后,这个对象的作用域也就没有了。/言外之意是说在方法里进行这样的赋值没有任何意义?
public static void main(String args[]){
//定义2个可变的String型,并分别传入A、B;
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
//调用静态方法,将a,b的值丢进去
operate(a,b);
System.out.println(a+","+b);
}
private static void operate(StringBuffer a, StringBuffer b) {
// TODO Auto-generated method stub
//在可变的String型字符串a中,添加可变的字符串b
//那么,a中本身的 A 又添加了b中的元素 B
a.append(b);
//接着把a的值赋给b
b=a;
}
}在这里,我是这么理解的,不知道你认不认为。
我上面的注释没问题,
重点是在调用静态方法operate(a,b)的时候,你传进去的是什么?
a调用append方法之后里面的元素变成了AB,都没异议吧?
然后,接着把a赋值给了b ,重点是,这个b到底是不是main方法的那个b?
赋值之后关闭operate方法,删除内存空间里面的一切信息,这里的b会引用传递给外面的b吗?
答案是否定的,operate传进来的是b1 ,而这里的b=a;到底用过了这个b1没有?
没有吧? 它跟外面的那个b已经没什么联系了
等operate方法调用完毕,删除了内存空间的信息,这个b=a 也就不复存在了。 这个b从诞生到结束,根本就没有被引用。。