这是一个经典问题。有很多类似的问题在stackoverflow上被提问且存在很多错误的、不完整的答案。如果您不去深究这个问题很简答。但是如果你深入去探究,又会令你很困惑。
public static void main(String[] args) {
String x = new String("ab");
change(x);
System.out.println(x);
}
public static void change(String x) {
x = "cd";
}上面代码会输出ab。
在C++中:
void change(string &x) {
x = "cd";
}
int main(){
string x = "ab";
change(x);
cout << x << endl;
}
输出:cd
x存储着指向堆中字符串对象”ab“的引用。所以当x作为参数传递给change()方法,它仍然指向在堆中的”ab“,像下图这样:
因为Java是值传递的,所以x的值是指向”ab“的引用。当方法change()被调用时,它会创建一个新的对象”cd“。现在x指向”cd“,像下图这样:
4.错误的解释
public static void main(String[] args) {
StringBuilder x = new StringBuilder("ab");
change(x);
System.out.println(x);
}
public static void change(StringBuilder x) {
x.delete(0, 2).append("cd");
}原文地址:http://blog.csdn.net/u010133536/article/details/42559081