这个是Java的经典问题。 许多类似的问题在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”。 当方法change()被调用时, 它创建个新的“cd”对象,x现在指向“cd”如下: 这看起来像是非常很合理的解释,它们清晰地描述了Java中按值传递。 三 代码实际上如何做 上面解释有几个错误。 当字符串“ab“被创建时,Java分配了内存去存在这个字符串对象。 因此,这个对象被赋值给变量x,这个变量实际被赋值给这个对象的引用。

变量x存储一个字符串对象的引用。 它是一个存储引用的变量(内存地址)。 下图显示了实际发生的: String传递实际过程 四 错误的解释 第一个代码片段的问题与字符串的不可变性无关。 即使用StringBuilder替代String,结果仍然相同。

关键是变量存储了引用,但是不是引用本身。 五 这个问题的解决 如果我们真的需要改变对象的值。