这是一个经典问题。有很多类似的问题在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