你调用operate()的时候,生成一个指向原字符串B的引用y,在函数里面你把这个y指向别处,并没有改变B的值,所以B仍然是原来的B;
而x是直接修改它所指向的A,所以A变了

解决方案 »

  1.   

    Tasia(非典型…………) 说的完成正确,我做了一个小例子import java.lang.*;
    public class a {
      public static void main(String arga[]){    StringBuffer a=new StringBuffer("A");
           StringBuffer b=new StringBuffer("B");
           System.out.println(operate(a,b));       /*a.append(b);
           b=a;
           */
           System.out.println(a+","+b);
    }
    static StringBuffer operate(StringBuffer x,StringBuffer y){
      x.append(y);
      y=x;
      return y;
    }}结果是:
    AB
    AB,B
      

  2.   

    这样就是来证明JAVA中是基于传值而不是指针的.
      

  3.   

    Tasia(非典型…………) 说的完成正确,我做了一个小例子import java.lang.*;
    public class a {
      public static void main(String arga[]){    StringBuffer a=new StringBuffer("A");
           StringBuffer b=new StringBuffer("B");
           System.out.println(operate(a,b));       /*a.append(b);
           b=a;
           */
           System.out.println(a+","+b);
    }
    static StringBuffer operate(StringBuffer x,StringBuffer y){
      x.append(y);
      y=x;
      return y;
    }}结果是:
    AB
    AB,B
    但是x呢,它在operate里面也是传的值呀,它的值在operate里面改变了(从A变成了AB),但是回到外面的语句体,x本身的值并没有改变呀,y的例子不是很好的说明这点吗,他原来的值是B,在operate里面赋值以后,变成AB,由于传的是值,所以在外面的语句体显示出来还是B。这该怎么解释呢?
      

  4.   

    no,楼主理解错误。
    x是值,它是个StringBuffer对象的引用值,和普通变量有点不一样:在x.append(y);后,是x通过了StringBuffer的方法改变了对象的值,它所引用的对象和a引用的是一个对象,它的变化是对象的变化,而不是x的变化,所以会有你看到的结果。
    要搞清1、java对象和对象引用的概念。2、通过方法改变的是heap(你现在可以理解为内存地址)中的值,而不是x本身。
      

  5.   

    楼上的认识完全正确,我补充一点。
    通过方法改变了heap中的值以后,从方法中出来。原来的应用所指向的依然是原来的对象。
    即:对象内容变了,引用本身没有变。
    所以第一次b的输出为:B
    而非:AB