java 三个引用之间的对象赋值

java object assignment between three references

我一直在学习编程面试,我有一个关于 java 对象分配的问题。

假设我有一个节点 class 并且我创建了三个实例。

Node a = new Node(1);
Node b = new Node(2);
Node c = new Node(3);

现在假设我做一个作业

a = b;

此时我知道我对节点 a 或 b 的属性所做的任何更改都会导致 a 和 b 的更改,因为这是一个浅拷贝。

a.data = 99 //then b.data will become 99

b.data = 99 //then a.data will become 99

但是如果我这样做

b = c;

现在我对节点 b 的 属性 所做的任何更改都不会对节点 a 产生任何影响。

b.data = 99;//then b.data will become 99 and c.data will become 99 but a.data will not change

我不明白这种行为。我知道节点 b 被分配了节点 c 地址的值,但是为什么这不会影响节点 a?

b 分配给 c 引用的对象不会影响 a,因为 b 不再引用 a 引用的同一个对象.这是正在发生的事情:

a -> (1)
b -> (2)
c -> (3)

现在执行a = b;。现在 2 个引用引用同一个对象。包含 1 的节点不再有任何对它的引用,它可以随时被垃圾回收。

a -\   (1)
    \
b ---> (2)
c ---> (3)

现在执行b = c;。这不会影响 a 引用其对象的方式。

a --\   (1)
     \
b -\  > (2)
    \
c ---->  (3)

现在 bc 指向包含 3 的节点,而 a 继续指向包含 (2) 的节点。这就是 a.datab.data 改变时不受影响的原因。他们又指代了不同的对象。