Java对象分配


问题内容

我是Java的新手,因此我对对象分配有一些疑问。例如,

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

假设变量i的测试类中定义的,我说得对假设T1和T2点到修改同一个对象t1.i=1会影响t1t2?其实我测试了一下,似乎我是对的。但是,当我尝试相同的操作时String,修改仅发生在不影响另一侧的一侧。这是什么原因呢?

编辑:我尝试使用String的情况。

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

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


问题答案:

您是对的,但字符串是特例;它们是不可变的,在这种情况下,它们像原始对象一样工作。

@newacct

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

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

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

@ user1238193

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

t1和t2将指向同一对象。对于任何Java对象(包括不可变对象)都是如此