2 u013179967 u013179967 于 2016.02.01 21:22 提问

结果为什么不是//AB,AB

public class Foo {
public static void main(String[] args) {
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
operator(a,b);
System.out.println(a+","+b);
}
public static void operator(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
}
}

4个回答

caozhy
caozhy   Ds   Rxr 2016.02.01 21:55

实参中的a b假设指向了buf1 buf2两个对象
调用函数,相当于用x y指向buf1 buf2(x=a y=b,但是x y和a b是两套)
现在让x指向y也就是buf1,但是原来的a b还是没有改变指向。

caozhy
caozhy 回复七夕蓝儿: 不等于。单向传值。
接近 2 年之前 回复
u013179967
u013179967 对于x,y的操作不等于对a,b的操作吗,可是为什么a改变了,b没有改变
接近 2 年之前 回复
caozhy
caozhy   Ds   Rxr 2016.02.01 21:52

y=x;改变了y的引用,但是不会作用到实参上。
正确的写法是
x.append(y);
y.setLength(0);
y.append(x.toString())

wwwsssaaaddd
wwwsssaaaddd   2016.02.01 21:37

y=x试图重新设置y这个引用变量指向地址(即指向a的地址),但不会成功。因为java方法参数都是传值调用,在方法中对于参数值的修改并不会实际修改外部相应的变量,也即是说operator(a,b)之后,b引用变量中的值(即new StringBuffer("B")对象的地址)并没有改变,因此System.out.println(a+","+b);打印的结果应该是:AB,B

wwwsssaaaddd
wwwsssaaaddd y和b是指向同一个对象的引用变量,引用变量类似c中的指针,y=x后y的指向发生改变,但此时并不会影响b的指向。方法执行完了,作为局部引用变量的y就消失了,但b仍然指向原来的对象,而原来对象内容并没有做过任何改变。
接近 2 年之前 回复
u013179967
u013179967 方法中传的参数只是new出来的那个对象,而不是引用,所以对y的操作并不等价于让b的指向改变,是这样理解的吗?
接近 2 年之前 回复
u013179967
u013179967 y=x;这个赋值操作不是把a的地址给b吗,而且在方法中测试y输出的确实是AB,为什么没有影响b的值的,而x对a的操作却改变了a的值
接近 2 年之前 回复
wwwsssaaaddd
wwwsssaaaddd a的值改变是通过x.append方法,方法参数x是和a都是new StringBuffer("A")对象的引用变量,x.append就等价于执行a.append;y和b都是new StringBuffer("B")这个对象的引用变量,方法中对于y的值修改,并不会影响到b这个引用的地址,所以最终b.toString的值仍然是"B"
接近 2 年之前 回复
u013179967
u013179967 我有点不太明白,为什么a的值改变了,b的值没有改变呢,能不能麻烦再解释一下,什么是传值调用?
接近 2 年之前 回复
u013179967
u013179967   2016.02.01 21:50

我有点不太明白,为什么a的值改变了,b的值没有改变呢,能不能麻烦再解释一下,什么是传值调用?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!