public class A {
   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;
 }
}最后的输出是AB,B
可是我觉得 x.append (y);改为x = x.append (y);才应该输出是AB,B啊...
哪位说下原因,先谢谢了...

解决方案 »

  1.   

    x.append (y);  已经对X进行了改变,所以不必再显式地给X赋值了.其它如replace也一样.
      

  2.   

    为什么不是输出 AB,AB
    为什么b的值没有变呢?
    在方法operate方法 中不是已经把x的值给y了么?
    难道在operate方法 中只有append对实参起作用,赋值语句不对实参起作用么?
    谢谢各位解答一下
      

  3.   

    我试验了一下,的确如此,在方法operate中赋值语句的确不能对实参起作用,但是append方法可以.有点意思哈...
      

  4.   

    LZ想弄明白这样的问题,从头到尾仔细分析。
    首先从main方法入手。
    StringBuffer a = new StringBuffer ("A");和StringBuffer b = new StringBuffer ("B");
    new了a和b两个对象,通过operate传递给了operate方法。在此方法中x.append (y);也就是说对象有了实质的改变:对象a通过 x.append (y);又新增了对象B中的“B”,此时对象a变成了AB。
    这道题的具体是看参数的传递。任何参数的传递其实都是传递对象的副本。而x.append (y);其实是改变了对象,而不是改动了副本。
      

  5.   

    正如 shuai45(付出总有回报,要做就做最好.)  所说,这是一个形参与是实参的问题。StringBuffer是一个对象,a 作为参数传入operate方法,在operate中改变,而x相当于C中的指针,其中存储的是a的地址,x=y不会影响a的内容。
      

  6.   

    java中对象的传递是传的实参的
      

  7.   

    public class A {
       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;
     }
    }
    这是道经典的面试题,考的是你的java基础牢固否。我们知道,一个方法的形式参数相当于这个方法的局部变量,x.append(y)大家都清楚了,这里不多说。y = x,这个只是在operate这个方法里的局部变量的赋值操作,一旦方法体结束,它们的有效范围也到了尽头,所以不会有任何作用的。所以最终b是不会发生改变的。