为什么如下代码会输出"ABCDE"   
          foo= "ABCDE";
  foo.substring(3);
  foo.concat("XYZ");
 System.out.println(foo);    而这样就输出"DE"
           String fo= "ABCDE".substring(3);
  fo.concat("XYZ");
  System.out.println(fo);
 如下又输出"DEXYZ"
    String fo= "ABCDE".substring(3).concat("XYZ");
 System.out.println(fo);

解决方案 »

  1.   

    foo.substring(3); 他虽然生成了一个字符串,但没有赋值给任何一个对象。所以马上被抛弃了!而
    String fo= "ABCDE".substring(3); 
    就有复制给 foconcat 同样的道理!
      

  2.   

    ......因为所以这个需要回答么关于对象和引用么,java的传值方式多看看就好啦。你第一个根本没有改变原来的对象,第二个改变了一半
    如果foo=foo.substring(3);foo=foo.concat("XYZ");第一个就对了,第二段程序以此类推。
      

  3.   

    总之String不可变,没有引用指向的String只能在那儿晾着呀。看看基础的书,这个是经典问题了。
    楼下会有详细解释的,hoho~
      

  4.   

    String是常量,没法更改的,但指向String的引用可以更改;
    当String的方法被调用时,通常会生成很多新的String常量:
    如你上面:
     foo= "ABCDE"; 
      foo.substring(3); //生成新的String常量: "DE"
      foo.concat("XYZ"); //生成新的常量"ABCDEXYZ"
       String fo= "ABCDE".substring(3); //生成两个常量“ABCDE”和“DE”
      fo.concat("XYZ");             //生成新的常量“DEXYZ”
      这下明白了吧?
      

  5.   

    foo= "ABCDE"; foo为“ABCDE”这个对象的一个引用。foo.substring(3); 并不是吧“ABCDE”这个对象给截取了,而是取得这个对象从下标为3开始的一个字串而已。“ABCDE”对象及其引用并没有变。而String fo= "ABCDE".substring(3); fo是"ABCDE".substring(3)取得字串后所得的“DE”的一个引用。以下的情况类似。
      

  6.   

    两块内存。二是一的复制。
    你改了二。但是打印的是一。(剩下就交给java垃圾收机制)
    明白?
      

  7.   


    为什么如下代码会输出"ABCDE"    
       foo= "ABCDE"; //不管你怎么操作foo是不会变的!String是恒常类!
      foo.substring(3); 
      foo.concat("XYZ"); 
     System.out.println(foo);     而这样就输出"DE" 
               String fo= "ABCDE".substring(3); //这里它已经DE了
      fo.concat("XYZ"); 
      System.out.println(fo); 
     如下又输出"DEXYZ" 
        String fo= "ABCDE".substring(3).concat("XYZ"); //DE+XYZ=DEXYZ
     System.out.println(fo); 
      

  8.   

    haha ,每次看帖子都会学到东西。
    努力加油!!!