问一JAVA基础题,下面程序打出来结果是:AB,B 
main调用operate(a,b)时,是对象引用的传递,传递a、b的地址给operate,在y=x的操作时,应该能改变b的值,为什么变量b的值没有发生改变呢?偶看不明白,请大家指点一下吧:)public class T{
public static void main(String[] arg){
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;
}

解决方案 »

  1.   

    y=x这句出现了等号,表明把x的引用赋给y的引用。在此题中是把a的引用赋给了b 的引用,而a和b本身并没有改变
      

  2.   


    没懂,如你所说把x的引用赋予给y,而在这之前x已经变成了AB了,那么y=x应该是引用AB才对啊
      

  3.   

    a   b   是2个指针  是实参
    x  y  也是2个指针  是形参a  b  和 x y之间的传递是值传递
    因此,形参y=x这句话,并不能影响到b,因此b仍然指向对象“B”但x.append (y);不一样,由于a和x指向同一个对象,因此利用x对该对象的改变,同样可以通过a来体验到,因此【a所指向的对象】变成了“AB”指针   指针指向的对象     不一样啊!!!一定要搞清楚
      

  4.   

    开始
    a指向地址0001,0001存着值A
    b指向地址0002,0002存着值B
    调用operate()后
    x指向地址0001,0001存着值A
    y指向地址0002,0002存着值B
    x.append(y);
    将x所指向的地址的内容改变为AB,这个时候x依然指向0001,但是0001中保存的值变为了AB
    y=x;
    再将y指向的地址变的和x所指向的地址相同,这个时候y指向地址0001,y引用AB
    而b并没有改变引用地址,他依然指向0002地址,并且0002地址的值也没有改变最终结果
    a=AB
    b=B
    x=AB
    Y=AB
      

  5.   

    public class Test{
    public static void main(String[] arg){
    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);
    System.out.println(x);
    System.out.println(y);
    y = x;
    System.out.println(x);
    System.out.println(y);
    }

    ==========
    结果:
    AB
    B
    AB
    AB
    AB,B
    可以看到第二个System.out.println(y);
    的地方,得到的值是AB果然很奇怪·值传递不像值传递,抵制传递不像地址传递
      

  6.   

    这里只是y指向了x
    并不是a指向了x
    想要a变成AB
    至少要让a指向y
      

  7.   

    这题把我糊弄得不轻,哈哈,明白了,谢谢;
    原以为y = x 是把x指向内容赋给y指向的内容-------------- 错!!!! 
    应该y = x 是值的传递,把x的值赋给y, 使y指向x所包含的地址,对b没有任何的改变
      

  8.   

    operate   (a,b); 
    就这么一句话,改变了a值,我是看不出哪里还会改变b值;
    operate方法里也没地方改变a、b的值。
    我哪里有错,请指教……