看下面这段java程序:====================================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);
   }
   static void operate (StringBuffer x, StringBuffer y) {
      x.append (y);
      y = x;
   }
}====================================为什么输出的是"AB,B",为什么不是"AB,AB"或者"A,B"呢?如果说:在void函数里,不能改变其reference参数指向,只能改变其内容,那下面这段程序又如何解释呢:====================================public class Test{
   public static void main(String[] args) {
      String a = new String("A");
      String b = new String("B");
      operate(a,b);
      System.out.println(a + "," +b);
   }
   static void operate(String x, String y) {
      x.concat(y);
      y = x;
   }
}====================================为什么又输出"A,B"呢?

解决方案 »

  1.   

    StringBuffer是可变的,String是不可变的Strings are constant; their values cannot be changed after they are created.
      

  2.   

    thrive_li() 能不能说明白一点,什么情况下string是不可变的
    你说在所有的情况下thier values cannot be changed after they are created.
    那显然不队
      

  3.   

    y = x;只是让y指向另外一个地方.
      

  4.   

    回复人: nimifeng(现在只想学点东西) ( ) 信誉:100  2005-04-26 16:46:00  得分: 0  
     
     
       y = x;只是让y指向另外一个地方.
      
     
    晕,这个我还是明白的,回复先看清楚别人问什么,这种回复简直废话
      

  5.   

    waterwash(水洗),我没求你说,再说你也不一定知道呢我之所以说 nimifeng(现在只想学点东西)的回复是废话
    因为我觉得从我的提问很明显我是明白“y = x;只是让y指向另外一个地方.”的
    ----------
    如果说:在void函数里,不能改变其reference参数指向,只能改变其内容,那下面这段程序又如何解释呢:
    ----------如果回复别人很明显已经知道的,那不是废话是什么
      

  6.   

    x.concat(y);//x只是a的一个引用,虽然在"A"后面加了一个"B",但变量a的指向还是没有改变.
      

  7.   

    可是就算改成
    x=x.concat(y);
    结果还是一样啊
      

  8.   

    在怎么说,人家也是在帮你,可能人家看错了,你用这种态度对想帮助你的人吗~!
    说句谢谢,在告诉人家你的意思会死啊~!
    看看:
    楼上的又折回来了~!
     nimifeng(现在只想学点东西) 
    人家怎么对你来着~!
    什么人啊你~!
      

  9.   

    第一个程序里的这句为什么又可以呢?
    x.append (y);    //和x=x.append (y); 效果一样
      

  10.   

    告诉你什么叫传址
    传址就是一种很特殊的传值,传的是一个引用(或称地址)
    通过这个地址可以访问并改变这个引用指向对象的值。修改结果并不需要传回,因为修改是在原来的对象上作直接修改。
    但是,这个地址的改变必须传回,不然就会丢失。
    x.append(y)是直接修改x这个地址所指向的对象的值,而
    y=x是把y这个地址换成了x这个地址,但是没有返回,所以一切不会有变化。
      

  11.   

    找手册来看一下
    String类和concat()方法
    StringBuffer类和append()方法
      

  12.   

    我对事不对人
    nimifeng(现在只想学点东西),第一回回复确实很无聊
    我也没骂他waterwash(水洗)
    希望你的下次回复最好是关于问题的
    不要再在这个问题上纠缠了每个人的性格不一样
    比如你看我说了别人的回复是废话很不爽
    而我则看了别人回复是我明显知道很不爽谁都无法要求别人完全符合自己的标准
    来csdn只想讨论问题
      

  13.   

    l楼主不看API,我所说的是拷贝的API的原语,楼主竟然说API不对,我无语.....
    好好看看Api吧.
      

  14.   

    String类是字符串常量,是不可更改的常量。而StringBuffer是字符串变量,它的对象是可以扩充和修改的。public class Test {
        public static void test(String str) {
            str = "World";
        }
        public static void main(String[] args) {
            String string = "Hello";
            test(string);
            System.out.println(string);
        }
    }
      运行结果:Hello
      为什么会这样呢?因为参数 str 是一个引用,而且它与 string 是不同的引用,虽然它们都是同一个对象的引用。str = "World" 则改变了 str 的值,使之指向了另一个对象,然而 str 指向的对象改变了,但它并没有对 "Hello" 造成任何影响,而且由于 string 和 str 是不同的引用,str 的改变也没有对 string 造成任何影响,结果就如例中所示。
      

  15.   


    就是String定义的是一个字符常量。是不可以改变的。就像 nimifeng(现在只想学点东西) 例子中:在main里,string = hello. 传给str的时候,则:string,str都等于"hello",而且指向同一内存空间。如果执行:str = "World";后,str 的值就是World了,可是不能改变string的值。而StringBuffer是动态分配内存空间的。所以1楼的代码就改变了x,y的值。但是由于作用域的不同,y等于了"AB",但是并没有改变b得值。b还是"B"。这段代码希望队楼主有帮助:public class haha
    {
       public static void main(String[] args) {
          StringBuffer a = new StringBuffer("A");
          StringBuffer b = new StringBuffer("B");
          operate(a, b);
          b = a;
          System.out.println(a + "," +b);
       }
       static void operate (StringBuffer x, StringBuffer y) {
          x.append (y);
          y = x;
          
          System.out.println(x+ "," + y);
       }
    }输出结果:
    AB,AB
    AB,B这段代码:
    public class haha
    {
       public static void main(String[] args) {
          StringBuffer a = new StringBuffer("A");
          StringBuffer b = new StringBuffer("B");
          operate(a, b);
          b = a;
          System.out.println(a + "," +b);
       }
       static void operate (StringBuffer x, StringBuffer y) {
          x.append (y);
          y = x;
          
          System.out.println(x+ "," + y);
       }
    }输出结果:
    AB,AB
    AB,AB我刚学Java不久。如果我说的不对还请各位见谅。
      

  16.   

    楼上的第一个程序输出结果为:
    AB,AB
    AB,AB
    因为加了b=a.
      

  17.   

    public class Test{
       public static void main(String[] args) {
          StringBuffer a = new StringBuffer("A");
          StringBuffer b = new StringBuffer("B");
          operate(a, b); //  main里的引用 "a", "b"复制过后 赋给 operate 里的 "x", "y"
          System.out.println(a + "," +b);
       }
       static void operate (StringBuffer x, StringBuffer y) {
          x.append (y); // 直接在x 指向的内存区域后加上 y 指向的内容
                        // 此时 x 指向区域的内容已经改变,(和main 里的"a"指向同一区域)
          y = x;   // 将 引用"x" 赋给"y" (不是将"x"指向的内容赋给"y"指向的区域)
                   // 此时"x", "y" 和main里的 "a"指向同一块区域,main里的 "b"本身和其指向的内容都没有变化
       }
    }
    ====================================public class Test{
       public static void main(String[] args) {
          String a = new String("A");
          String b = new String("B");
          operate(a,b);
          System.out.println(a + "," +b);
       }
       static void operate(String x, String y) {
          x.concat(y); // 唯一和上面不同的就是这一步,首先jvm会分配一个新的内存空间"*1",
                       // 然后在"*1"的后面加上引用"y"指向的内容。
                       // 此时 "x" 和 "x" 指向的内容都没有改变
                       // 另:如果是 x = x.concat(y); 则会将 "x"指向 "*1",但是x原来指向的内容还是不会改变 
          y = x;
       }
    }====================================
      

  18.   

    多谢各位热心帮忙
    现在我似乎明白了,最关键是这句:
    String类是字符串常量,是不可更改的常量。而StringBuffer是字符串变量,它的对象是可以扩充和修改的。
    明天上班结帖
      

  19.   

    api文档里的确是有
    因为我英文不好,所以看的就不是很耐心
    今后应该加强这方面的学习了
      

  20.   


    pgemini1981(氷珏焱) 你的java学的真强啊!!
    给我一些学习java 的经验啊!!
    我才刚学习java啊!!!
    不知道怎么学习她~~~~脑子里一头雾水不知道从何下手啊~~~~
    555555555
    望给以点学习的经验之谈~~~~
    谢谢~~~
      

  21.   

    见http://community.csdn.net/Expert/topic/3960/3960063.xml?temp=.2276575
    如果楼主编过C++,那么……在上面的代码中
    operate函数原型等于C++里的:
    static void operate(StringBuffer *x, StringBuffer *y) ;
    (假设C++里有StringBuffer这种数据类型)
    然后通过operate(&a, &b)调用
    a,b实际上都是指向某个StringBuffer的指针
    调用operate函数时是将两个与a,b指向相同StringBuffer对象的两个新的指针传递到函数内部
    对新的指针进行操作
    所以用x.append()能改变a和x共同指向的那个对象
    但y=x改变的是y指针,不改变b指针而楼主原来对该代码的理解则是:
    operate函数原型等于C++里的:
    static void operate(StringBuffer &x, StringBuffer &y) ;
    然后通过opearte(a,b)调用
      

  22.   

    java的参数是值传递而已,本身并没有被修改,所以在operate(a,b);中a和b都没被改掉,在println中还是原来的值,而且string是不可变的,一定义后该对象本身就固定了, concat后产生的是一个新的string对象,stringbuffer是可变的,可以对其本身进行修改,append后还是本身那个对象,大家看我说的到底对不对,学习中...
      

  23.   

    1楼就已经回答了。:
    StringBuffer是可变的,String是不可变的Strings are constant; their values cannot be changed after they are created.
     x.append (y); //append是StringBuffer的方法;x.concat(y); //concat是String的方法
      

  24.   

    wearetheone(beehead)
    唧唧歪歪,像个女人,BS你
      

  25.   

    那么说,在一个方法的参数列表里的x, y, 只是调用方法时新创建的指针?
    也就是相当于StringBuffer x = a;StringBuffer y = b;   x, y, 和a,b, 是相互独立的?
    请问各位是这样吗?
      

  26.   

    <font size=5>测试一下</font>
    </Content>
    fdajkfdja fdajfksjafda