public class Foo 

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

        x.append(y) ;
         y = x; 
}

解决方案 »

  1.   

    static 
    你寫成static是在加載的時候就執行了一次operate了
    y=ab了
    然后再次執行輸出是aab把
      

  2.   

    public static void main(String[] args)
    {
    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;
    // y.deleteCharAt(0).append("C");
    }
    结果是AB,B;如果用注释的部分替代y = x,结果为AB,C;
      x.appen(y)这句使x所指向的值变化,而y=x这句却是使y指向x的值。然而a和b仍然指向的是原来的值,所以
    结果为AB,B;如果用注释部分代替,则是使y所指向的值变化,这样结果为AB,C;
      如果把StringBuffer换成String,在operate函数中相应的改变,则结果对原值无影响,因为String是
    不可变的,每次对其的变化其实是他自己又重新申请了内存块,然后指向了新的内存块,对原来的值根本没有
    变化,而StringBuffer是可变的,每次的变化可以在本身进行改变,而且如果变化的值本来就存在,就会直接指向
    已经存在的那一块,这个和String是一样的。如 y =x,就是直接指向了X。
      

  3.   

    StringBuffer 是引用数据类型。
    传的是地址。
      

  4.   

    operate (a,b);   这句话执行的时候   x.append(y) =》 这时的x 变成了AB ,然后才把y=AB
    System.out.print(a + "," + b);   这里先输出了 AB 然后输出了B。
      

  5.   

    加载的时候static方法是不会执行的,只是把这个方法的信息写入jvm的方法区而已,当作类信息使用
      

  6.   


    public class Test2 {    public static void main(String[] args) {
            StringBuffer a = new StringBuffer("A");
            StringBuffer b = new StringBuffer("B");
            operate(
                a,
                b);
            //因为你在方法operate内部对a的属性改变了,所以这里a输出AB
            //你在方法operate内部只是把b引用指向了x(a),但是方法结束后引用会重新指向之前的那个地址块,也就是说b!但是咱们在方法内部没有对引用b(y)指向的地址块的内容改变,那个地址里的内容是不变的!
            System.out.println(a + "," + b);
        }    static void operate(StringBuffer x, StringBuffer y) {
            //就相当于你改变了StringBuffer a的一个属性,这么理解吧
            x.append(y);
            //y引用指向了x(a)
            y = x;
            System.out.println(x);//输出AB
            System.out.println(y);//输出AB    }
    }
    输出结果:
    AB
    AB
    AB,B
      

  7.   


    既然y指向x,那打出来得应该是AB,A 啊?为什么a和b仍然指向的是原来的值?
      

  8.   

    public class StrBuf  
    {  
        public static void main (String [] args)   
        {  
           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;  
           System.out.println(x+ "," + y); ///////////////
      } 

    在楼主的代码中加上一行,输出的结果是AB,AB AB,B
    楼主就能明白a,x,y的指向的地址de内容是“AB” 而b指向的地址de内容是“B”
    zai传参数的时候,y=b;是把y指向了b中的内容;而在y=x时y指向的是a(或x)中的内容“AB”
    明白了没有?
      

  9.   

    传参的问题。x.append(y) 这个 对传入的a的值做了修改,所以传地址的时候修改后的值也被传了,Y的没有。所以不变
      

  10.   

    lz,你为什么认为输出的会是"AB","AB" ? 
      

  11.   

    其实这是个参数传递的问题。
    lz在operat()中传递的是对象,
    x.append(y)这句对对象本身的成员作了修改,所以方法结束后依然有效。
    y=x这句只是对对象的引用作了修改,在方法中是有效的,方法结束后失效。原来的引用还是指向原先的对象。
      

  12.   

    Java语言的变量名虽是引用语义,但参数传递是值语义。
      

  13.   

    在JAVA中,类型为类的变量,保存的都是类的对象的引用。
    x.append(y) ; //改变了 x引用的类的对象。 
    y = x;  //只是改变了y的引用,并没有改变 y引用的对象。
    (y和b 虽然有同一个对象的引用。但,他们是两个变量,不是一个,所以,改变y的引用,根本没法改变b的引用)
      

  14.   

    public class Foo 

        public static void main (String [] args)  
        { 
           StringBuffer a = new StringBuffer ("A"); 
          StringBuffer b = new StringBuffer ("B"); 
          operate (a,b); //a=x="AB",虽然y的直也改变了,由于y是引用,所以b的直不变
          //a="AB",b="B"
          System.out.print(a + "," + b); 
        } 
      static void operate (StringBuffer x, StringBuffer y)  //x=a="A" y=b="B"

            x.append(y) ;//x=a="AB" y=b="B"
             y = x; //x="AB" y=x="AB",y的应用指向x也就是a,但是并没有改变b的直“ B”
    }
      

  15.   

    很简单,java中以对像为参数的时候,传进去的是对象引用的一份拷贝。当对象改变的时候,自然打印出来的是改变的,也就是x.append(y)的效果而y = x只是把y这个引用的拷贝的内容变成了x,但是外部的引用b没有发生改变,引用的对象也没有改变。
      

  16.   

    传参的问题。 x.append(y) 这个 对传入的地址的值做了修改,y=x没有对y原来指向的地址(b指向的地址)的值作修改,而是使y指向了新的地址,b指向的地址不变,所以是B.
    public class Test3 {
    public static void main (String [] args)   
        {  
          StringBuffer a = new StringBuffer ("A");  
          StringBuffer b = new StringBuffer ("B");  
          operate (a,b);  
          System.out.print(a + "," + b);  
        }  
      static void operate (StringBuffer x, StringBuffer y)   
       {  
            x.append(y) ; 
             y.deleteCharAt(0).insert(0,x);
       } }
      

  17.   


    static void operate(StringBuffer x, StringBuffer y)
        {
            x.append( y );
            y = x;//其实这里应该这样理解,y是x的另外一个引用
            x.append(" 1111111 ");
        }最后输出应该是
    AB11111111,B
      

  18.   

    引用调用问题!
    当调用operate(a, b)方法的时候是吧a,b的地址存放到x,y中,operate 中 x.append(y)是吧a地址中的值改变了所以a的值是:AB
    y = x;是把y的指向了x的地址而b地址里面的值没有变化所以b的值是:B
    所以输出  AB,B