分配后,类数据成员不会更改

时间:2016-05-06 10:42:13

标签: java pointers reference

有一个代码:

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不会改变?正如我在分配期间所理解的那样,左值采用正确值的参考,如果右值将在之后改变,则左值也必须改变。为什么不发生?

4 个答案:

答案 0 :(得分:2)

请使用a.x重新分配变量d,因为x是{A}的int和对象成员。因此,值的分配正在发生而不是参考

谢谢。

答案 1 :(得分:2)

这是因为你正在使用原语。复制值,而不是引用。

如果您要使用对象,那么它们将具有相同的引用并具有您期望的结果。

答案 2 :(得分:1)

int d = 10;
a.x = d;

你在这里做了什么,你把d复制到了a.x所在的内存中(注意:你正在处理的是基元而不是对象,所以没有引用,就像对象一样)。因此,10d分为两个地方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

然后52a,因为您将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没有任何影响 因为原语不是引用。他们没有联系在一起。