黑马程序员技术交流社区

标题: String 可变问题!<已解决> [打印本页]

作者: 余银桂    时间: 2012-6-14 22:47
标题: String 可变问题!<已解决>
本帖最后由 余银桂 于 2012-6-14 23:10 编辑
  1. public class Test2{
  2.          
  3.          public static void stringReplace(String text){
  4.                
  5.                  text=text.replace('j','l');
  6.          }
  7.          public static void bufferReplace(StringBuffer text){
  8.         
  9.                  text=text.append("c");
  10.          }
  11.          public static void main(String args[]){   
  12.   
  13.                  String textString=new String("java");
  14.                  StringBuffer textBuffer=new StringBuffer("java");
  15.                  stringReplace(textString);
  16.                  bufferReplace(textBuffer);
  17.                          System.out.println(textString+textBuffer);
  18.          }
  19.   }

  20. 运行结果是 javajavac   

  21. 为什么String的那个没变? 在String中 哪些是可变的?哪些又不可变?
复制代码

作者: 王晓新    时间: 2012-6-14 23:03
  1. public class Test2
  2. {         
  3.          public static String stringReplace(String text){
  4.                
  5.                  text=text.replace("j","l");
  6.                                  return text;
  7.          }
  8.          public static void bufferReplace(StringBuffer text){
  9.         
  10.                  text=text.append("c");
  11.          }
  12.          public static void main(String args[]){   
  13.   
  14.                  String textString=new String("java");
  15.                  StringBuffer textBuffer=new StringBuffer("java");
  16.                  bufferReplace(textBuffer);
  17.                  System.out.println(stringReplace(textString)+textBuffer);
  18.          }
  19. }
复制代码

作者: 王晓新    时间: 2012-6-14 23:05
text=text.replace('j','l'); 这条这样写也是对的
作者: 梁清平    时间: 2012-6-14 23:06
楼主啊。。。你这个程序不在于String中什么可变不可变。。。
问题在于你的程序编写的有问题。。。
stringReplace(textString);这句代码的改变的只是stringReplace方法内部的text局部变量的值。。当方法运行结束时。。这个变量也消失了。。跟没调用一样样的。。。
对传入的textString更是没造成任何改变。。

至于StringBuffer你调用的是append方法。。当然后追加进去了。。实际上也跟上面的情况一样。。局变量也被改了。。但也消失了。。但是原串也追加进去了。。

你这两方法封装的实在没必要。。代码写成这样就会不一样了。。

public class Test2{
         
         public static void stringReplace(String text){
               
                 text=text.replace('j','l');
         }
         public static void bufferReplace(StringBuffer text){
        
                 text=text.append("c");
         }
         public static void main(String args[]){   
  
                 String textString=new String("java");
         textString = textString.replace('j','l');//多加这一句。。
          StringBuffer textBuffer=new StringBuffer("java");
                 stringReplace(textString); //这方法调也没用
          bufferReplace(textBuffer);
                 System.out.println(textString+textBuffer);
         }
  }
作者: 余银桂    时间: 2012-6-14 23:09
梁清平 发表于 2012-6-14 23:06
楼主啊。。。你这个程序不在于String中什么可变不可变。。。
问题在于你的程序编写的有问题。。。
stringRe ...

哦,搜滴寺内,了解了!
作者: 余银桂    时间: 2012-6-14 23:09
梁清平 发表于 2012-6-14 23:06
楼主啊。。。你这个程序不在于String中什么可变不可变。。。
问题在于你的程序编写的有问题。。。
stringRe ...

哦,搜滴寺内,了解了!
作者: 王明明    时间: 2012-6-14 23:11
  1. public static void main(String args[]){   
  2.         String textString=new String("java");
  3.         StringBuffer textBuffer=new StringBuffer("java");
  4.         stringReplace(textString); //虽然这里调用了stringReplace()方法,但是并没有为textString赋值,所以textString的值仍然是"java"
  5.         bufferReplace(textBuffer); //这里StringBuffer进行了append追加,其值为"javac"
  6.         System.out.println(textString+textBuffer); //"java"+"javac"
  7.       }
  8.    }

  9. 这样就可以得到你想要的结果了:
  10. public class Test {
  11.         public static String stringReplace(String text) {
  12.                 text = text.replace("j", "L");
  13.                 return text;
  14.         }
  15.         public static void bufferReplace(StringBuffer text) {
  16.                 text = text.append("c");
  17.         }
  18.         public static void main(String args[]) {
  19.                 String textString = new String("java");
  20.                 StringBuffer textBuffer = new StringBuffer("java");
  21.                 textString = stringReplace(textString);
  22.                 bufferReplace(textBuffer);
  23.                 System.out.println(textString + textBuffer);
  24.         }
  25. }
复制代码

作者: 王明明    时间: 2012-6-14 23:12
  1. public static void main(String args[]){   
  2.         String textString=new String("java");
  3.         StringBuffer textBuffer=new StringBuffer("java");
  4.         stringReplace(textString); //虽然这里调用了stringReplace()方法,但是并没有为textString赋值,所以textString的值仍然是"java"
  5.         bufferReplace(textBuffer); //这里StringBuffer进行了append追加,其值为"javac"
  6.         System.out.println(textString+textBuffer); //"java"+"javac"
  7.       }
  8.    }

  9. 这样就可以得到你想要的结果了:
  10. public class Test {
  11.         public static String stringReplace(String text) {
  12.                 text = text.replace("j", "L");
  13.                 return text;
  14.         }
  15.         public static void bufferReplace(StringBuffer text) {
  16.                 text = text.append("c");
  17.         }
  18.         public static void main(String args[]) {
  19.                 String textString = new String("java");
  20.                 StringBuffer textBuffer = new StringBuffer("java");
  21.                 textString = stringReplace(textString);
  22.                 bufferReplace(textBuffer);
  23.                 System.out.println(textString + textBuffer);
  24.         }
  25. }
复制代码

作者: 张頔    时间: 2012-6-14 23:15
public class Demo{
         
         public static void stringReplace(String text){ //你的方法没有返回值,这里就有局部变量和成员变量的问题                                                                    //这里的 text虽然变化了但是并没有返回给主函数中的textString
                 text=text.replace('j','l');                        
         }
         public static void bufferReplace(StringBuffer text){ //这个也是上边的原因
        
                 text=text.append("c");
         }
         public static void main(String args[]){   
  
                 String textString=new String("java");
                 StringBuffer textBuffer=new StringBuffer("java");
                 stringReplace(textString);
                 bufferReplace(textBuffer);
                         System.out.println(textString+textBuffer);
         }
  }

//运行结果是 javajavac   

//为什么String的那个没变? 在String中 哪些是可变的?哪些又不可变?
作者: 揭耀祖    时间: 2012-6-14 23:40
public static void stringReplace(String text){     //String是当做基本数据类型传递参数的,在java中基本数据类型在进行函数参数传递时是以值传递的,text只是在这个函数内改变了但是原地址中的值没变,而StringBuffere是类类型对象,是以地址传递的,所以如果这里把String改成StringBuffere的话那么输出的就是“lava”。
                                           //第二种方案就是再加个return text;语句的话结果也是“lava”.
text=text.replace('j','l');

}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2