哪位大侠能告诉我为什么这段代码执行的结果是javajavac
public class Test {
public static void stringReplace(String text){ 
text=text+”c”;
}
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);
}
}

解决方案 »

  1.   

    因为参数传进去的String都是重新建立的String,~~~~作用域只限函数内
      

  2.   

    我的textString这是new 出来的,按道理应该是对象引用啊,都不是什么字符串池的说法了
      

  3.   

    string 是不可变的 stringbuffer 是可变的stringReplace(textString); textString=java text=java
    text=text+”c”; textString=java  text=javac 这里会新生成一个字符串对象
    stringbuffer 不用说了吧 直接在原来的字符串后面加“c”
      

  4.   

    为生字符串拼接要用StringBuffer而不用String LZ这例字很好的表达出来了
      

  5.   

    stringReplace(textString);
    这一句过去的是引用类型还是值类型啊?我有点晕
      

  6.   

    明白String 长度不可变和 StringBuffer可变的,在想下内存里他们是怎么存在的就明白了
      

  7.   


    引用 textString 和 text 都指向同一个对象 java
      

  8.   

    我这不是说拼接哈。我想知道这是为什么,那如果我改下
    String textString = "java";
    stringReplace(textString);
    这样这个"java"的值是在字符串池中,我还想得通一点,但是现在的情况是我传的是一个引用类型,是堆里的内存地址啊
      

  9.   

    传的都是引用的拷贝~~主函数内的textString和函数参数text指向同一块内存。只是因为传String的时候,因为String是不可变的,所以当你+拼接的时候,text引用指向了另一块内存地址。而原来的那个textString还指向原来的内存!但是用StringBuffer的时候 这两个就随时都指向着同一块内存!!
    这个解释比较正确
      

  10.   

    问题的关键就是String是个不可变类,而StringBuffer是可变类,String textString = new String("java");之后通过上面静态方法执行的时候,其实只是新建了一个对象,暂时的textString副本吧,然后将"javac"赋值给了textString副本,注意因为String是不可变类,实践上并没有你理解的类似C里面的指针传递
    因为最后那个stringReplace方法返回值是void,实际上你执行stringReplace(textString)的时候,对textString没有做任何更改,暂时的textString副本没任何意义。
    而StringBuffer是可变类,所以在执行方法的时候,持有就是类似C语言里面的指针,因此能够改变StringBuffer。如果你想实现通过stringReplace方法来改变textString值,可以这样做public class Test {
    public static void stringReplace(String text) {
    text = text + "c";
    }

    public static String stringReplace2(String text) {
    return text = text + "c";
    } 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);
    textString=stringReplace2(textString);
    System.out.println(textString + textBuffer);
    }
    }