Java 对象赋值

我是Java的新手,我有一些关于对象分配的问题。例如

Test t1 = new Test();
Test t2 = t1;
t1.i=1;

假设变量是在 Test 类中定义的,那么假设 t1 和 t2 都指向同一个对象,其中修改会影响和,我是否正确?实际上,我测试了它,似乎我是对的。但是,当我在 上尝试同样的事情时,修改只发生在另一侧不受影响的一侧。这背后的原因是什么?it1.i=1t1t2String

编辑:我用String尝试的案例。

String s1 = "0";
String s2 = s1;          
s1 = "1";
System.out.println(s1);
System.out.println(s2);

我通过在String上测试案例来意识到我的错误,因为它是不可变的。我认为修改字符串的情况实际上是将“1”的引用返回到s1。尽管如此,我的问题仍然存在。是否会导致 t2 和 t1 都指向同一个对象,或者每个对象现在都有自己的对象?这种情况是否适用于 Java 上的所有对象?s1="1"Test t2 = t1;


答案 1

你是对的,但字符串是一个特例;它们是不可变的,在这种情况下表现得像原语。

@newacct

我引用 http://docs.oracle.com/javase/tutorial/java/data/strings.html

注: String 类是不可变的,因此一旦创建了 String 对象,就无法更改它。String 类具有许多方法,其中一些将在下面讨论,这些方法似乎可以修改字符串。由于字符串是不可变的,因此这些方法的真正作用是创建并返回包含操作结果的新字符串。

这就是字符串成为特例的原因。如果您不知道这一点,则可能会期望引号中讨论的方法不会返回新字符串,这将导致意外的结果。

@user1238193

考虑您的以下问题:“测试 t2 = t1;导致 t2 和 t1 都指向同一个对象,或者每个对象现在都有自己的对象?这种情况是否适用于 Java 上的所有对象?

t1 和 t2 将指向同一对象。这适用于任何 java 对象(包括不可变对象)


答案 2

你的第一个假设是正确的。使用以下代码行:

Test t1 = new Test();

创建一个新的 Test 对象,同时创建一个名为 t1 的测试引用来引用它。

在您发布的代码的第二行:

Test t2 = t1;

您实际上是在创建另一个 Test 引用,并将其分配给引用 t1 引用的同一对象。

所以会影响它毕竟是同一个对象。t1.i = 1;t2.i

至于字符串,字符串是不可变的,在实例化后无法修改。

关于您的编辑:

String s1 = "0";
String s2 = s1;          
s1 = "1";
System.out.println(s1);
System.out.println(s2);

他们会打印不同的结果,因为当你实际说

s1 = "1";

您实际上将 s1 绑定到另一个 String 对象,但 s2 仍将引用值为“0”的对象。