从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类和自声明类之间的区别吗?谢谢你的帮助!
答案 0 :(得分:4)
不,不同之处在于你所做的改变。
此代码:
s2.setText("second")
不会更改s2
或s1
的值。 s1
和s2
都引用与之前相同的对象...但对象的内容已更改。
将此与此代码进行比较:
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")