日期:2014-05-20  浏览次数:20786 次

求助关于传值的问题
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

------解决方案--------------------
s=s.replace('j','l');
s是局部变量,s.replace('j','l')会返回一个新的引用,相当于
s = new String(s.replace('j','l'));
只是改变了局部变量的引用值。
------解决方案--------------------
值传递:(形式参数类型是基本数据类型,这里的基本数据类型包括String):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。

引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。
参考:http://zhidao.baidu.com/question/295083208.html

LZ需要好好的理解一下引用传递与值传递,我觉得上面的解释将引用传递与值传递的区别说得很清楚,也最易于理解。
------解决方案--------------------
是String特殊而已,区分一下String与其他引用类型的变量,看下java变成思想13.1节:不可变String

------解决方案--------------------
可以参看JDK API
String类是final修饰的,不可变
API对replace()方法的说明:

replace
public String replace(char oldChar,
char newChar)返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 而生成的。 
如果 oldChar 在此 String 对象表示的字符序列中没有出现,则返回对此 String 对象的引用。否则,创建一个新的 String 对象,用来表示与此 String 对象表示的字符序列相等的字符序列,除了每个出现的 oldChar 都被一个 newChar 替换之外。