解决方案 »

  1.   


    c.append("B"); //会改变c所指向对象的值
    d=c;                   //d只是b的一份引用拷贝,此处赋值只会改变d,与b无关
      

  2.   

    结果是     AB,B
      

  3.   

    StringBuffer c  和  StringBuffer a  是同一个内存空间 c.append("B");    就是往空间里加入元素
    结果为 AB,B
      

  4.   


    static void oper(StringBuffer c,StringBuffer d){
              c.append("B");   // a = AB
              d=c;                     //  b 的拷贝指向了a 的地址,和b 本身的指向已经没有关系了,b 依然是 B
    }
      

  5.   

    运行结果AB,B
    具体解释:调用函数oper(a,b),将c指向a所指向的地址,d指向b所指向的地址,执行c.append("B")语句,是将c所指向的地址所存储的值由原来的“A”变为"AB",而执行语句d=c,只是将d指向了c所指向的地址,并不影响b的指向,所以结果变为a=“AB”,b=“B”
      

  6.   

    此题关键就在于 oper(c,d) 方法,这个方法到底做了什么,怎么结果就和想的不一样呢?
    那么,就来看一下这个方法做了什么。我写了一段代码替代这个方法,如有不对的地方还望指出:package test;
    public class Jtest{
          public static void main(String[] args) {
            StringBuffer a=new StringBuffer ("A"); 
               StringBuffer b=new StringBuffer ("B");
               //取代 oper(a,b) start;
            StringBuffer c;
            StringBuffer d;
            c = a; //c的地址指向了a,此时 c 的值为"A";
            d = b; //d的地址指向了b,此时 d 的值为"A";
            c.append("B"); //在c(a)的地址值变为 “AB”
                d=c; // d的地址指向了c,也就是指向了a,**关键就在这里了**,那么可以看到,这个过程中根本就没对b做任何操作,
                //就好像gg(d)路过一mm(b),说:这mm(b)不错,然后发现前面有个更有吸引力的mm(c),然后拿了一朵花("B")给mm(c(a))了,然后就见异思迁了,所以mm(b)压根就不知道什么情况,没参与
               // so, b 还是b("B") , a已不是a("A"),二是a("AB")
                //取代 oper(a,b) end; 
                System.out.print(a+","+b);
          }
          static void oper(StringBuffer c,StringBuffer d){
              c.append("B");   
              d=c;
              //一开始的想法是这样的,c = a; d= b; 那么 c.append("B");后 c=“AB”,d=c = "AB",实际上并不是数学中的简单等价传递
          }
    }
      

  7.   


    谢谢,我明白了,再问下,java中什么情况传值,什么情况下传址呢?
      

  8.   

    public class TestMain { public static void main(String[] args) {
    // TODO Auto-generated method stub String s1 = "aaa";
    String s2 = "bbb";
    System.out.println(s1 + "," + s2);
    swap(s1, s2);
    System.out.println(s1 + "," + s2); } private static void swap(String x1, String x2) {
    String temp;
    temp = x1;
    x1 = x2;
    x2 = temp;
    }
    }
    这个和楼主那个貌似是一样的道理
      

  9.   


    谢谢,我明白了,再问下,java中什么情况传值,什么情况下传址呢?我也不大懂噢,但是如果是int类型的话,就是值传递,如果是 传递对象比如Collection 那么就是传址了,你搜一下,有很多博客写这个歌值传递和引用传递的
      

  10.   

    看看这个博客。http://blog.csdn.net/xiaohulunb/article/details/39036315