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

三个引用之间的java对象赋值,java,object,copy,deep-copy,Java,Object,Copy,Deep Copy,我一直在学习编程面试,我有一个关于java对象分配的问题 假设我有一个节点类,我创建了三个实例 Node a = new Node(1); Node b = new Node(2); Node c = new Node(3); 现在让我们假设我做了一个任务 a = b; 在这一点上,我知道我对节点a或b的属性所做的任何更改都将导致对a和b的更改,因为这是一个浅拷贝 i、 e 或 然而,如果我这样做 b = c; 现在,我对节点b的属性所做的任何更改都不会对节点a产生任何影响 b.data

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

假设我有一个节点类,我创建了三个实例

Node a = new Node(1);
Node b = new Node(2);
Node c = new Node(3);
现在让我们假设我做了一个任务

a = b;

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

i、 e

然而,如果我这样做

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被执行。现在两个引用引用同一个对象。包含
1
的节点不再有对它的任何引用,可以随时对其进行垃圾收集

a -\   (1)
    \
b ---> (2)
c ---> (3)
现在
b=c被执行。这不影响
a
引用其对象的方式

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

现在
b
c
指向包含
3
的节点,而
a
继续指向包含(2)的节点。这就是为什么
a.data
在更改
b.data
时不受影响的原因。它们再次引用了不同的对象。

“此时,我知道我对节点a或b的属性所做的任何更改都将导致a和b的更改,因为这是一个浅拷贝。”不,这是不正确的。您只能对每个引用指向的对象本身进行更改。欢迎使用StackOverflow。请花几分钟时间访问并阅读。我们要求您在发帖前进行充分的在线调查,以确保您的问题不会被简单的谷歌搜索(即Java参考作业)轻易回答。
a -\   (1)
    \
b ---> (2)
c ---> (3)
a --\   (1)
     \
b -\  > (2)
    \
c ---->  (3)