我一直在学习编码访谈,我对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?
答案 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)
现在b
和c
指向包含3
的节点,而a
继续引用包含(2)的节点。这就是a.data
更改后b.data
不受影响的原因。他们再次提到不同的对象。