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 = x.append(y);
y = x;
}请问输出结果,并请大侠们解释一下

解决方案 »

  1.   

    哦,上面我错了!看来很多基础知识还是需要巩固。应该是AB,B
      

  2.   

    是相当于传址 x = x.append(y);//改变了内存里的内容,所以a的内容也会变
     y = x;//只是改变了y的指向,b不受影响
      

  3.   

    结果是AB,B,但是不太了解为什么,谢谢楼上
      

  4.   

    x,y只是a,b的一份拷贝。 所以再改变x,y都不改变a,b
    但是x.append(y);改变了x地址指向的内容,所以a的内容也会改变
      

  5.   


     x = x.append(y);//这里的x是引用传递。一般对象都是引用传递,但是。。
        y = x;//但是当你改变引用传递的对你的时候,这个对象就会new 新创建。
    我也是乱说的。
      

  6.   

    整个过程生成四个引用
    a,b,x,y
    二个对象
    new StringBuffer("A") //object1
    new StringBuffer("B") //object2执行前
    a指向object1
    b指向object2
    x指向object1
    y指向object2执行后
    x = x.append(y) //object1内容变成(AB),x指向object1
    y = x //y指向object1a指向object1
    b指向object2所以打印出AB ,B (object2内容无变化)
      

  7.   

    谢谢,以为自己看了think in java 中的,就明白了引用
    class Letter{
    char c;
    }
    public class PassObject {
    static void f(Letter y){
    y.c = 'z';
    }
    public static void main(String[] args) {
    Letter x = new Letter();
    x.c ='a';
    print("1: x.c " + x.c);
    f(x);
    print("2: x.c " + x.c);
    }
    }
      

  8.   

    AB,B
    因为传到operator方法中的是两个StringBuffer对象的拷贝,在operator方法中的任何赋值操作都不会影响原来对象的值,但是x.append(y)既改变了拷贝内容也改变了原对象的值。
      

  9.   


         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;
    }把代码改成这样,结果还是AB,B。
    证明赋值操作确实没有影响到a,b,影响的是x.append(y)
      

  10.   

    ab,b 执行了apennd方法后a引用的对象发生了变化
      

  11.   

    关于在于“y = x”这个赋值操作并不改变b里面的内容,只是将y指向x。任何时候都要对“赋值”操作提高警惕。如果像C++里面对一个原始类型的引用(例如int)进行这样的赋值操作,那么函数返回之后,这个副作用对调用者来说是可见的。
      

  12.   

    class Change{
        public void change(String str,char ch[],int i){
            str="test ok";
            ch[0]='g';
            i++;
        }
    }public class Test8 {
        public static void main(String args[]){
            String str="good";
            char ch[]={'a','b','c'};
            int i=3;
            Change cha=new Change();
            cha.change(str,ch,i);
            System.out.println(str);
            System.out.println(ch);
            System.out.println(i);
        }
    }
    结果为:
    good
    gbc
    3
    可见数组和其它类型不一样,传的是地址,结果改变这里需要解释一下,java基本类型(byte、int、char、long、float、double、boolean和short)是传值,也就是传的是副本,而其余传的是引用(所谓引用传递就是把对象的引用地址传进函数,而不是像值传递那样产生一个副本),对于字符串对象来说,虽然在参数传递的时候也是引用传递,但是java虚拟机在函数内部对字符串对象进行了特殊处理--视String对象为常量(final) 所以对传进来的引用地址所引用的string对象比能直接进行修改,而是产生一个副本对其进行操作,对其进行的操作不会影响原来的值。这就是为什么字符串和数组都是引用传递,字符串没变而数组变了的原因String传的是值,改变的是局部变量的值,对其他范围没有影响。
    Char[] 传的是地址,改变值就等于改变了内存中原先的数组的值。
    故答案为: good and gbc
      

  13.   

    AB,B
    传参问题,不知道楼主有没有学过C语言,有学过的话,理解起来问题不大!