public class Foo {
public void change(String s)
{
s=s.replace('j','l');
}
public void change(StringBuffer s)
{
s=s.replace(0, 1, "l");
}
public static void main(String args[]){
Foo f = new Foo();
String s="java";
//StringBuffer s = new StringBuffer("java");
f.change(s);
System.out.println(s);
} }//java
lava
为何第一次输出的是java,而不是lava
public void change(String s)
{
s=s.replace('j','l');
}
public void change(StringBuffer s)
{
s=s.replace(0, 1, "l");
}
public static void main(String args[]){
Foo f = new Foo();
String s="java";
//StringBuffer s = new StringBuffer("java");
f.change(s);
System.out.println(s);
} }//java
lava
为何第一次输出的是java,而不是lava
s是局部变量,s.replace('j','l')会返回一个新的引用,相当于
s = new String(s.replace('j','l'));
只是改变了局部变量的引用值。
参考:http://zhidao.baidu.com/question/295083208.htmlLZ需要好好的理解一下引用传递与值传递,我觉得上面的解释将引用传递与值传递的区别说得很清楚,也最易于理解。
想输出java 那就把s声明全局变量。
String类是final修饰的,不可变
API对replace()方法的说明:replace
public String replace(char oldChar,
char newChar)返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 而生成的。
如果 oldChar 在此 String 对象表示的字符序列中没有出现,则返回对此 String 对象的引用。否则,创建一个新的 String 对象,用来表示与此 String 对象表示的字符序列相等的字符序列,除了每个出现的 oldChar 都被一个 newChar 替换之外。