public class TestProgram {
public static void main(String[] args)
{
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
Operate(a,b);
System.out.println("a:"+a);
System.out.println("b:"+b);
}
public static void Operate(StringBuffer x,StringBuffer y)
{
x.append(y);
y=x;
}
}我觉得应该是输出 a:AB b:AB阿.但是实际结果是a:AB b:B
这是怎么回事阿..调试了下,在y=x这一句执行以后y确实是AB阿, 方法调用结束了b的值不会修改吗.? 这里的传参是值传递?
不过StringBuffer是引用类型的阿,,怎么回事阿? 等待高手们解答
记住一点,Java只有值传递
Operate中的x与y都只是局部变量,函数执行完x与y消失
调用Operate(a, b)的时候,a的值(指向的对象的地址)传给x,b的值传给y
此时a与x指向一个对象,b与y指向一个对象
x.append(y)
a与x指向的对象为内容"AB"
y=x
此时
y、x、a指向了同一个对象,但是b还是原来的(想一下看)
执行完Operate后,x、y消失
a指向内容为"AB"的StringBuilder
b指向内容为"B"的StringBuilder
执行x.append(y)后T1里变成了"AB",此时a跟x仍然指向T1
执行y = x;后,即将x里存的地址值赋给y,此时有a,x,y同时指向T1,而T2(存的值没变,仍然只有"B")只有b指向它所以你打印b(打印出T2里的内容"B"),当然只是“B”
如果这里是给个int什么的我知道是传值的..StringBuffer是个引用类型的阿.怎么也传值阿?
Java中,只有值传递,所以当y的地址改变成了x的地址(即a),所以并没有对b进行操作
作web开发经常接触的request到处传,但是getAttribute和setAttribute的影响
的scope是request的,这就是基于引用传递,引用存在的意义就是在背调用处可以改变
数据达到某种返回的效果!