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是引用类型的阿,,怎么回事阿?  等待高手们解答

解决方案 »

  1.   

    和StringBuffer没有关系,是参数传递机制导致的,你将b当作参数传给Operate()的y参数的时候,是将b指向的那个对象的地址拷贝给了y,而你在方法内将y指向另一个地址,并不影响方法外的b变量。建议好好研究一下java的参数传递机制,最好能和其他语言对比起来看。
      

  2.   

    又是传值问题
    记住一点,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
      

  3.   

    进入方法时进行值传递,即引用a跟x指向同一对象(假设为T1,存"A"),b跟y也指向同一对象(假设为T2,存"B")
    执行x.append(y)后T1里变成了"AB",此时a跟x仍然指向T1
    执行y = x;后,即将x里存的地址值赋给y,此时有a,x,y同时指向T1,而T2(存的值没变,仍然只有"B")只有b指向它所以你打印b(打印出T2里的内容"B"),当然只是“B”
      

  4.   

    谢谢LS三位指点..大概有些明白了.不过我还有些疑问就是,当初老师有告诉过我java都是传值的,但是如果是传对象的话就是传引用.. 
      如果这里是给个int什么的我知道是传值的..StringBuffer是个引用类型的阿.怎么也传值阿?  
      

  5.   

    楼上说的很好啊本来我也不怎么懂,看了楼上的觉得很正确x->a,y->bx.append(y);即x指向的a对y指向的b进行操作;y=x;本来y->b,x->a(a已经变成了a+b)。如此一来,y->a,此时y的值变成了a(即a+b)。由于此时y没有操作b,所以外边的变量b没有变化。
      

  6.   


    Java中,只有值传递,所以当y的地址改变成了x的地址(即a),所以并没有对b进行操作
      

  7.   

    建议学学C里面的指针,如果你把C指针搞明白了,这就全不是问题了
    作web开发经常接触的request到处传,但是getAttribute和setAttribute的影响
    的scope是request的,这就是基于引用传递,引用存在的意义就是在背调用处可以改变
    数据达到某种返回的效果!
      

  8.   

    值传递和值引用是有很大的区别的了,像String,bufferstring是值引用了,把数据结构看看就明白了
      

  9.   

    java中调用函数进行值交换只能用数组