因为java中所有的方法调用都是采用值传递的方法. 注意 public void setNewString(String str) { str = new String("a new String"); } a.setNewString(str); 参数中的str和方法定义中的String str是两个不同的变量,他们相同的地方是你调用方法的时候,他们指向同一个String对象,就是"aaa" 但是在方法中str=new String("a new String");让方法里的str指向了一个新的变量,但是方法外面定义的str仍然指向"aaa"这个对象. 方法结束之后,方法中的str变量就消失了,所以对"a new String" 的引用就不存在了,这个对象也就成为了垃圾. 但是方法外面定义的str不会受到影响.
看看这个例子可以更好的明白 : public class Main { public static void main(String[] args) { StringBuffer str = new StringBuffer("aaa"); A a = new A(); System.out.println(str); a.setNewString(str); System.out.println(str); } }class A { public void setNewString(StringBuffer buffer) { buffer.append("修改了引用所指向的对象的内容"); buffer = new StringBuffer("让buffer这个引用指向新的对象"); } }
注意
public void setNewString(String str)
{
str = new String("a new String");
} a.setNewString(str);
参数中的str和方法定义中的String str是两个不同的变量,他们相同的地方是你调用方法的时候,他们指向同一个String对象,就是"aaa"
但是在方法中str=new String("a new String");让方法里的str指向了一个新的变量,但是方法外面定义的str仍然指向"aaa"这个对象.
方法结束之后,方法中的str变量就消失了,所以对"a new String" 的引用就不存在了,这个对象也就成为了垃圾.
但是方法外面定义的str不会受到影响.
public class Main { public static void main(String[] args) {
StringBuffer str = new StringBuffer("aaa");
A a = new A(); System.out.println(str);
a.setNewString(str);
System.out.println(str); }
}class A { public void setNewString(StringBuffer buffer) {
buffer.append("修改了引用所指向的对象的内容");
buffer = new StringBuffer("让buffer这个引用指向新的对象");
}
}