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

解决方案 »

  1.   

    s=s.replace('j','l');
    s是局部变量,s.replace('j','l')会返回一个新的引用,相当于
    s = new String(s.replace('j','l'));
    只是改变了局部变量的引用值。
      

  2.   

    值传递:(形式参数类型是基本数据类型,这里的基本数据类型包括String):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。
    参考:http://zhidao.baidu.com/question/295083208.htmlLZ需要好好的理解一下引用传递与值传递,我觉得上面的解释将引用传递与值传递的区别说得很清楚,也最易于理解。
      

  3.   

    是String特殊而已,区分一下String与其他引用类型的变量,看下java变成思想13.1节:不可变String
      

  4.   

    “String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包括修改后的字符串内容。而最初的String对象则丝毫未动。”——Bruce Eckel
      

  5.   

    正解,
    想输出java 那就把s声明全局变量。
      

  6.   

    可以参看JDK API
    String类是final修饰的,不可变
    API对replace()方法的说明:replace
    public String replace(char oldChar,
                          char newChar)返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 而生成的。 
    如果 oldChar 在此 String 对象表示的字符序列中没有出现,则返回对此 String 对象的引用。否则,创建一个新的 String 对象,用来表示与此 String 对象表示的字符序列相等的字符序列,除了每个出现的 oldChar 都被一个 newChar 替换之外。