public class Test {
public  static  void  main(String [] args){
 StringBuffer a =new StringBuffer("A");
 StringBuffer b =new StringBuffer("B");
operate(a,b);
System.out.println(a + "," + b);
}public static void operate(StringBuffer x,StringBuffer y  ){
x.append(y);
y=x;
}
}
答案是 AB,B
y=x,y为什么没有被赋值,都他妈的见了鬼了.

解决方案 »

  1.   

    operate(StringBuffer x,StringBuffer y) 中的y是b对象引用值的一个拷贝,
    调用operate(a,b);时传来的时b的引用值,在operate函数中修改的也只是b的引用值y,所以并没有修改b对象本身。
      

  2.   

    我来解释下,不对还请指正当执行到operate(a,b)时,实参 X,Y分别指向a,b的对象,因此第一条x.append(y);便修改了a的内容,(此时a 为AB,b为B)但第二条y=x;只是让y指向了x的对象,因此不会改变b的内容,PS:(因为你的最终输出是a  b才是那个结果,为了验证可以在函数里输出x y,)
      

  3.   

    好像也是不对哦,在函数中输出x,y,结果就是AB,AB
    这个问题的确有点奇怪的说
      

  4.   

    这道题老早讨论了,楼主可以搜下以前的帖子看看~~
    楼主注意,这里只是把a,b的引用符给个了x,y,本身是不变的。就是a,b所指向的内存地址是不变的。内存里值变化,是因为你用的是StringBuffer。
    看看这个帖子吧,里面偶说的很详细了,就不在这里再说了。hoho
    http://community.csdn.net/Expert/topic/5176/5176149.xml?temp=.9088861
      

  5.   

    你可以跟面试你的人说,这样写是很不规范的
    因为在operate函数里面对外面传近来的对象进行了修改,是极其危险的
    哈哈
      

  6.   

    如果方法的参数是int,char,long等简单类型,则传递的是值得拷贝。
    如果方法的参数是对象类型,传递的是引用的拷贝。中的参数x,y是变量a,b的引用拷贝,即指向同一个对象。
    y=x 并没有改变 b 的指向StringBuffer对象是可以修改的字符串。
    它调用append()方法时,不重新分配内存,直接在先前的内存空间里进行修改。
    所以 a 指向的内存中的值已经改变.
      

  7.   

    StringBuffer对象是可以修改的字符串。
    它调用append()方法时,不重新分配内存,直接在先前的内存空间里进行修改。
    所以 a 指向的内存中的值已经改变.楼上的这句是关键,要注意这点与String的区别,本题涉及的其他知识就是关于传值和传引用的问题,已经讲很多了,这种题最好在纸上画画图就可以很好理解。先a指向A,然后在调用operate时,x也指向A,operate里面修改了x所指向的这段内存的内容(改为AB),由于a也指向的是也是指向这段内存的内容,相应的它的值也变化了。如果是String的话结果会有不同。
      

  8.   

    public static void operate(StringBuffer x,StringBuffer y  ){
    x.append(y);
    y=x;
    }x.append(y) 改变了x的属性
    而y=x只是改变了y的引用建议楼主看一下java基础:The Java Programming Language
      

  9.   

    基本的java问题了:Java的基本数据类型参数传递时是值拷贝传递,函数内修改的只是拷贝的临时值,不影响函数外的原变量;Java对象参数传递时是对象的引用拷贝传递,函数内修改的只是临时引用,也不影响函数外的原对象本身。
      

  10.   

    值传递 y是b地址的一个拷贝 y=x 并没有改变b的值 第一个append之所以会改变值是因为StringBuffer是可自身修改的字符串变量 x.append(y) 将x指向地址的内容更改了 由于a也是指向此内容所以a的内容也更改了 如果是String的化就不会这样 因为String是不可自身更改的 所以x=x+b 此时x的地址已经不等于原来x的地址
      

  11.   

    public class Aa {
    public  static  void  main(String [] args){
     StringBuffer a =new StringBuffer("A");
     StringBuffer b =new StringBuffer("B");
     operate(a,b);
     System.out.println(a + "," + b);
    } public static void operate(StringBuffer x,StringBuffer y  ){
    x.append(y);
    y=x;       //这里y的指向改变了。不在代表b
    y.append("我现在是代表A对象了");
    System.out.println(x + "|" + y);
    }
    }
    这个程序运行的结果如下:AB我现在是代表A对象了|AB我现在是代表A对象了
    AB我现在是代表A对象了,B
      

  12.   

    复习一下c里面的指针也许能够搞清楚啊
    int a = 1;
    int b = 2;
    int *c = &a; //c是a的引用
    int *d = &b; //d是b的引用
    main()
    {
       d = c;   //d也成了a的引用
       printf("%d",*d);
       scanf("%d");
    }
    输出结果 1 变了;
    再看下面的程序
    int a = 1;
    int b = 2;
    int *c = &a; //c是a的引用
    int *d = &b; //d是b的引用
    void aaa(int *p1,int *p2)
    {
    p2 = p1;
    }
    main()
    {
       aaa(c,d);
       printf("%d",*d);
       scanf("%d");
    }
    输出结果是2 没变!! 原因:执行aaa(c,d);时传入的只是c,d的一个副本(当然他也是a,b的引用,但并不是c,d),所以并不影响真正的c,d
    再看下面程序
    int a = 1;
    int b = 2;
    int *c = &a; //c是a的引用
    int *d = &b; //d是b的引用
    void aaa(int *p1,int **p2)
    {
    *p2 = p1;
    }
    main()
    {
       aaa(c,&d);
       printf("%d",*d);
       scanf("%d");
    }
    输出结果是1,变了,不知道怎么表述了,表达能力有限,不好意思.
    跟搂住这里的参数传递是一样的,因为传入的不是b,而是b的一个副本所以对b来说y=x无效,如果可以像上面一样传入一个b的指针的话可以,不过java好像不能实现哦
      

  13.   

    看完书再来发牢骚不迟吧lz,郁闷死了,这么简单的问题我还没有学java的时候就知道你的错了,靠。
      

  14.   

    以下的例子可以清楚地了解其机理:package src;public class ObjectModify { public static void main(String[] args) { TestObject testA = new TestObject(1);
    TestObject testB = new TestObject(2);

    System.out.println("before modify");

    // 修改之前打印出两个类对象,注意其HashCode
    testA.print(testA.toString());
    testB.print(testB.toString());

    modify(testA, testB);

    System.out.println("after modify");

    // 修改之后打印出两个类对象,注意其HashCode
    // A,B对象仍然是修改前的两个独立对象
    // 而A对象已经通过内部方法修改,B对象则保持原貌
    testA.print(testA.toString());
    testB.print(testB.toString());
    }

    private static void modify(TestObject A, TestObject B) {

    // A对象被内部方法修改
    A.modify(11);

    // B的引用发生改变,指向了A对象,而B对象不变
    B = A;

    System.out.println("modifying");

    // 修改之后打印出两个类对象,注意其HashCode
    // B对象跟A对象其实是同一个
    A.print(A.toString());
    B.print(B.toString());
    }}
    class TestObject{

    int i;

    public TestObject(int i) {
    this.i = i;
    }

    public void modify(int i) {
    this.i = i;
    }

    public void print(String className) {
    System.out.println(className + "=" + i);
    }
    }结果:before modify
    src.TestObject@7ced01=1
    src.TestObject@1ac04e8=2
    modifying
    src.TestObject@7ced01=11
    src.TestObject@7ced01=11
    after modify
    src.TestObject@7ced01=11
    src.TestObject@1ac04e8=2