public class Foo { public static void main(String[] args) {
 StringBuffer a=new StringBuffer("A");
 StringBuffer b=new StringBuffer("B");

operator(a,b);
System.out.println(a+","+b); }
   static void operator(StringBuffer x,StringBuffer y){
   x.append(y);
   y=x;

   }
}打印的结果是:AB,B
public class Foo { public static void main(String[] args) {
 StringBuffer a=new StringBuffer("A");
 StringBuffer b=new StringBuffer("B");
  a.append(b);
   b=a;

System.out.println(a+","+b); }
}
打印结果却是:  AB,AB   这是为什么呢?

解决方案 »

  1.   

    很简单的
    static void operator(StringBuffer x,StringBuffer y){
    x.append(y);
    y=x;}
    这里你不过是把对象X的引用值传递给Y,而不是像下面的
    a.append(b);
    b=a;
    直接是b的引用值传递给a,所以
    上面的例子中,b的值并没有改变
    下面的b确有改变,不知道这样说,楼主明白么
      

  2.   

    1.operator方法里,y=x,
    这个y只是方法的局部变量,不能带到方法外(当然改变对象y的属性值除外。)。
    所以a=AB
    而b依然是B。2.操作于对象a,再将a赋予对象b。
    a,b对象一样。所有同样输出AB
      

  3.   

    java是采用值调用(Call by value)。你定义的方法operator(StringBuffer x,StringBuffer y),在执行poerator(a,b)时过程是这样的:先将x y初始化为a和b这两个引用的拷贝,也就是x=a,y=b,然后执行x.append(y),由于x和a指向的同一对象,所以x=a="AB",然后执行y=x,现在y和x和a引用的都是同一对象"AB",方法执行完毕。但b="B"该引用没有变,你的方法改变的只是b那个副本y的引用,打印a b的记过当然是AB、B了。记住以下两条:
    1.方法不能修改基本数据类型。
    2.方法不能实现让一个引用引用一个新的对象。第二条的原因就是上面所说的。
    关于方法参数在Horstmann的《Core Java》第八版卷一第115页有详细论述。
      

  4.   

    StringBuffer a=new StringBuffer("A");
    StringBuffer b=new StringBuffer("B");
    a.append(b);
    b=a;这个是把A后面继续添加个B,所以a的值为AB,
     最后a把值又赋给了b,所以b就和a的值一样了。都成AB了。
     而第一个是引用值。
      

  5.   

    因为,StringBuffer是可以改变字符串的值
    所以在operator中append方法是将字符串进行累加
    虽然y=x;但是在调用operator方法的时候,你没有用一个变量去接收y的值
    所以y的值在方法中变了,也就是引用变了,而实际的值没有改变
    故打印AB,B而第二个例子是在调用了append方法后
    a的值为AB对吧?然后,接着把a的值赋给b了
    所以b的值就是AB了。
      

  6.   

    java的参数传递都是传值,但对象参数所传的值是指向对象的实参的引用。基本数据类型都是传递实参的值的副本,所以,形参变化,实参不会变化。
    对象的地址和基本数据类型都存在栈(stack)中;对象实体存在于堆(heap)中。
      

  7.   

    static void operator(StringBuffer x,StringBuffer y){
    x.append(y);
    y=x;
    }
    楼主请听解释:
    a,b的值传进operator后,有x=a,y=b,即x指向a所指的对象,y指向b所指的对象。
    x.append(y)这一步操作修改了x所指的对象的内容,即a的内容。
    而y=x却没有修改b所指的对象。y仅仅是指向b所指对象的一个引用 ,执行y=x操作只是让y这个引用指向其他的对象,根本就没有对原来指向的对象造成任何影响。