public static void main(String arg[]) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b);
System.out.println(a + "," + b);
}
static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y = x;
}
运行结果是:AB,B最后的语句y=x为什么没有使b的值改变
而x.append(y)却改变了呢

解决方案 »

  1.   

    java是传值的,改变整个对象是该不了的,但是可以改变里面的值
    可以参考《java核心》
      

  2.   

    y在operate方法中是AB,赋值了,你在主函数里面调用的operate方法b只作为一个参数传递,不会改变它的值。
      

  3.   

    又是这个问题?  记住一点..Java的参数传递就是一个拷贝的过程,你修改的是副本,而不是原对象
      

  4.   

    x.append(y) append 是StringBuffer的一个方法
    而StringBuffer是比较特殊的一个类
    我觉得你可以去好好看一下String和StirngBuffer的区别
    你就明白了
      

  5.   

    这个知识点在<<疯狂java讲义>>中讲得非常清楚...
    里面分析了内存的变化情况...
    a 和 x 都只是指向了同一块内存,
    b 和 y 也都指向同一块内存.
    方法中x.append(y)修改了改a 和 x 都指向的内存("A")...
    后来 y = x 这句只是让 y 和 a 和 x 都指向一块内存("A")...
    现在只有b指向内存"B"...
      

  6.   

    修改一下...打快了,写错了...
    这个知识点在 < <疯狂java讲义>>中讲得非常清楚... 
    里面分析了内存的变化情况... 
    a 和 x 都只是指向了同一块内存, 
    b 和 y 也都指向同一块内存. 
    方法中x.append(y)修改了改a 和 x 都指向的内存("A"),变成了"AB"... 
    后来 y = x 这句只是让 y 和 a 和 x 都指向一块内存("AB")... 
    现在只有b指向内存"B"...
      

  7.   

    java方法中参数进行的是值传递,而不传引用。方法得到的是所有参数值的一个拷贝,即方法不能修改
    传递给它的任何参数变量的内容。
      

  8.   

    题目很经典,String StringBuffer,StringBuilder的区别多看看
      

  9.   

    append是追加啊..肯定输出2个啊!
      

  10.   

    public static void main(String arg[]) {
    StringBuffer a = new StringBuffer("A");
    StringBuffer b = new StringBuffer("B");
    operate(a, b);
    System.out.println(a + "," + b);
    }
    static void operate(StringBuffer x, StringBuffer y) {
    System.out.println("y1"+y);
    x.append(y);
    y = x;
    System.out.println("y2"+y);

    b的地址确实没有变 
    y的值是改变了的 但b并没有指向y
      

  11.   

        通过a,b传递的是对象的引用  也就是说 ax指向同一个内存区域 by指向同一个区域  y=x  只是只是将x指向的那区域地址付给y了 也就是说现在yxa指向统一区域   而b指向的区域 没有任何改变   希望对你有帮助 
      

  12.   

    实参和形参你都没搞懂!!!y=x没有改变a,b的值,只是改变引用x,y的值,出了作用域就没有效果了
      

  13.   


    StringBuffer是对象类型,传的是引用。并且是原来引用的副本。也就是说x,y只是和a,b指向同样对象的另外2个引用。
    x.append(y); 的时候直接修改了引用指向的对象,所以吧原引用打印出来也是修改了的。
    y = x;  的时候,只是让y指向别的对象,原来的引用b并不受影响。所以不会改变。