引用相同字符串对象的两个java变量不同步

时间:2016-01-10 14:24:37

标签: java

从Java对象的新手角度来看,如果两个变量引用一个对象,则更新一个变量应该对另一个变量执行相同的操作,如下面的代码所示:

SomeObject s1 = new SomeObject("first");
SomeObject s2 = s1;
s2.setText("second");
System.out.println(s1.getText()); // print second
System.out.println(s2.getText()); // print second as well

我引用了此thread的代码。

但是,这并不适用于String类。请参阅以下代码:

String s_1 = new String("first");
String s_2 = s_1;
s_2 = "second";
System.out.println("s_1: " + s_1 + " s_2:  " + s_2); 
//s_1 appears to be "first" and s_2 "second"

这是因为String类和自声明类之间的区别吗?谢谢你的帮助!

2 个答案:

答案 0 :(得分:4)

不,不同之处在于你所做的改变。

此代码:

s2.setText("second")

不会更改s2s1的值。 s1s2都引用与之前相同的对象...但对象的内容已更改。

将此与此代码进行比较:

s_2 = "second";

您可以在此处将s2的值更改为对其他对象的引用。更改s_2的值根本不会更改s_1的值 - 它仍然指向之前执行的相同对象。

你可能想要阅读the differences between variables, objects and references - 一旦你能清楚地了解它,其他一切都会更有意义。

答案 1 :(得分:0)

可以在不调用构造函数的情况下初始化String对象。因此,当您将s_2初始化为s_1时,会给出它的值,当您初始化s_2 = "second"时,它会被覆盖。它与s2 = s1相同,然后是s2 = new SomeObject ("second")