有一个代码:
class A {
int x = 12;
}
public class Program {
public static void main(String [] args) {
A a = new A();
int d = 10;
a.x = d;
System.out.println("a.x: " + a.x + ", d: " + d);
d = 52;
System.out.println("a.x: " + a.x + ", d: " + d);
}
}
输出结果为:
a.x: 10, d: 10
a.x: 10, d: 52
为什么a.x
不会改变?正如我在分配期间所理解的那样,左值采用正确值的参考,如果右值将在之后改变,则左值也必须改变。为什么不发生?
答案 0 :(得分:2)
请使用a.x
重新分配变量d
,因为x
是{A}的int
和对象成员。因此,值的分配正在发生而不是参考
谢谢。
答案 1 :(得分:2)
这是因为你正在使用原语。复制值,而不是引用。
如果您要使用对象,那么它们将具有相同的引用并具有您期望的结果。
答案 2 :(得分:1)
int d = 10;
a.x = d;
你在这里做了什么,你把d复制到了a.x
所在的内存中(注意:你正在处理的是基元而不是对象,所以没有引用,就像对象一样)。因此,10
和d
分为两个地方a.x
。接下来,您更改d = 52;
的值d
已更改为a.x
,但10
有自己的值A a2 = new A();
。
当你有:
时会发生同样的事情a2.x = a.x;
a.x = 50;
你做了类似的事情:
a2.x
x
将是10,因为它的另一个对象具有自己的原始A a2 = new A();
a = a2;
a.x = 52;
,并且您将值复制到它,并且更改其中一个只是更改它,而不是另一个。
但如果你这样做:
a2.x
然后52
将a
,因为您将a2
的引用更改为指向使用GC
引用的对象(在此之前引用的对象将免费挂起,因此a2.x
会在决定时删除,因此现在a.x
和<android.support.design.widget.TabLayout
app:tabBackground="@drawable/tab_background"/>
是相同的原语。
答案 3 :(得分:0)
您从未将a.x
重新分配给新值。
实例A a = new A();
仍然得到旧的d
值,因为它基本上将其复制到内存中
那个时间点。
稍后您为d
分配了一个新值,这对实例a
没有任何影响
因为原语不是引用。他们没有联系在一起。