我是新来的Java和我心目中关于对象分配的一些问题。 例如,
Test t1 = new Test();
Test t2 = t1;
t1.i=1;
假设可变i
被测试类中定义的,我在右到T1和T2点假设同一个对象,其中修改t1.i=1
同时影响t1
和t2
? 其实我测试了它和好像我是对的。 然而,当我尝试同样的事情String
,修改仅发生一侧在另一边不受影响。 这背后有什么原因?
编辑:我用字符串审理案件。
String s1 = "0";
String s2 = s1;
s1 = "1";
System.out.println(s1);
System.out.println(s2);
我通过对字符串测试的情况下,因为它是不可改变的实现我的错误。 在这里我想这种情况s1="1"
修改字符串其实是在回国的“1”的S1参考。 不过,我的问题依然存在。 是否Test t2 = t1;
导致两个T1和T2指向同一对象或每个现在有自己的对象吗? 请问这种情况适用于Java的所有对象?
Answer 1:
你是对的,但字符串是一个特例; 他们是不可变的,像在这种情况下,原语。
@newacct
我引述http://docs.oracle.com/javase/tutorial/java/data/strings.html :
注意:String类是不变的,所以一旦它创建了一个String对象不能改变。 String类有许多方法,其中的一些将在下面讨论,显示修改字符串。 由于字符串是不可变的,什么这些方法确实是创建并返回一个包含操作的结果,一个新的字符串。
这是什么使字符串的一个特例。 如果你不知道这一点,你可能期望在帖不回新的字符串讨论的方法,将至极导致意想不到的结果。
@ user1238193
考虑到你的以下问题:“测试T2 = T1,导致两个T1和T2指向同一对象或每个现在有自己的对象并没有这种情况适用于Java的所有对象?”
T1和T2将指向同一个对象。 这对于任何Java对象真(包括不变的对象)
Answer 2:
你是对你的第一个假设。 用下面的代码行:
Test t1 = new Test();
您创建一个新的测试对象,并在同一时间,你创建一个测试基准名为t1来引用它。
在您发布的代码的第二行:
Test t2 = t1;
你实际上是在创建另一个测试参考,并分配它来指同一个对象,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到另一个字符串对象,但S2仍将指的对象值为“0”。
Answer 3:
你是绝对正确的,因为T1和T2指的同一个对象,该对象状态的任何CHANE会影响到两者。
字符串是不可变的对象。 因此,它不能在所有的修改。 看到这个在Java不可变对象的更多信息。
Answer 4:
你是在两种情况下做完全不同的事情。 在第一种情况下,具有t1.i = 1;
,要修改的对象的指向t1
。 在第二种情况下,与t1 = "1";
,要更改的参考点到另一个对象(类似于当你没有t2 = t1;
如果你做同样的事情, Test
你在第二种情况下做到了,你会得到相同的结果(假设Test
有一个构造函数取整数):
Test t1 = new Test(5);
Test t2 = t1;
t2 = new Test(1); // Here we are assigning to the variable, just like your 2nd example
System.out.println(t1);
System.out.println(t2);
人们提到String
是不可改变的。 但是,这是不相关的,也没有在语言“可变性”的概念,并有多么“可变”和“不变”类的工作没有区别。 我们非正式地说,一类是“不可改变的”,如果它发生在没有你可以设置能够改变其内部内容的任何字段或任何方法。 这样是与壳体String
。 但是,一个可变类会工作,如果你根本就没有做任何事情,它发生变异完全相同的方式。
Answer 5:
String对象是不可改变的 。
编辑
是否Test t2 = t1;
导致两个T1和T2指向同一对象或每个现在有自己的对象吗?
是。 虽然t2
是一个新的参考,但它会指向同一个对象,因为你告诉它这样做。 创建一个新的参考t2
类型的Test
,让它指向一个相同的对象t1
所指向。
但是,当你做到这一点与String
秒,然后做一些像s1 = "1" ;
你正在S1点到另一个String对象。 你可以在条款认为它s1 = new String(1);
。
Answer 6:
字符串就像任何其他对象。 因此,任何变量,你将它们分配指的是物体的非常相同的实例,就像你与你的测试对象做。
但是,请记住,字符串没有场你可以设置你喜欢的测试做的,所以你基本上不能做同样的测试,所以没有办法从端口测试对象String对象的代码。
您可以使用原始类型,如长,诠释等等他们是“按价值”赋给变量得到相反的行为,因此,如果你这样做
int t1 = 12;
int t2 = t1;
t1=15;
T2仍然具有价值12
文章来源: Java Object Assignment