三个引用

时间:2016-01-23 00:51:43

标签: java object copy deep-copy

我一直在学习编码访谈,我对java对象分配有疑问。

说我有一个Node类,我创建了三个实例。

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

现在让我们说我做了一个任务

a = b;

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

即。

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

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

但是,如果我这样做

b = c;

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

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

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

1 个答案:

答案 0 :(得分:2)

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.data更改后b.data不受影响的原因。他们再次提到不同的对象。