A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余银桂 中级黑马   /  2012-6-14 22:47  /  1835 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余银桂 于 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中 哪些是可变的?哪些又不可变?
复制代码

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
  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. }
复制代码
回复 使用道具 举报
text=text.replace('j','l'); 这条这样写也是对的
回复 使用道具 举报
楼主啊。。。你这个程序不在于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);
         }
  }

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1 赞一个!

查看全部评分

回复 使用道具 举报
梁清平 发表于 2012-6-14 23:06
楼主啊。。。你这个程序不在于String中什么可变不可变。。。
问题在于你的程序编写的有问题。。。
stringRe ...

哦,搜滴寺内,了解了!
回复 使用道具 举报
梁清平 发表于 2012-6-14 23:06
楼主啊。。。你这个程序不在于String中什么可变不可变。。。
问题在于你的程序编写的有问题。。。
stringRe ...

哦,搜滴寺内,了解了!
回复 使用道具 举报
  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. }
复制代码
回复 使用道具 举报
  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:23
9#
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中 哪些是可变的?哪些又不可变?
回复 使用道具 举报
public static void stringReplace(String text){     //String是当做基本数据类型传递参数的,在java中基本数据类型在进行函数参数传递时是以值传递的,text只是在这个函数内改变了但是原地址中的值没变,而StringBuffere是类类型对象,是以地址传递的,所以如果这里把String改成StringBuffere的话那么输出的就是“lava”。
                                           //第二种方案就是再加个return text;语句的话结果也是“lava”.
text=text.replace('j','l');

}

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马