1

假设我有一Node堂课。它只有一个字段,Node parentNode.也有 setter 和 getter。

我有 2 个节点:Node nodeANode nodeB.

这就是我想要做的:将nodeB' 父级设置为nodeA' 父级,然后将nodeA' 父级设置为空。

  1. nodeB.setParent(nodeA.getParent());
  2. nodeA.setParent(null); // bad since nodeB.getParent() will = null

要实现上述目标,我必须先克隆nodeA,然后再做nodeB.setParent(nodeAClone.getParent())吗?

4

2 回答 2

3

因为 nodeX.parent 是对对象的引用:

  • 当您打电话时,nodeB.setParent(nodeA.getParent())您是在对 nodeB 说“这里是 nodeA 父级的地址”。
  • 然后当你说nodeA.setParent(null);你对 nodeA 说“忘记你的父母住在哪里。你的父母现在什么都不是。”
  • 您在第二个语句中对 nodeB 什么也没说,它仍然具有现在其父级的地址。
于 2013-02-11T23:18:17.307 回答
2

nodeA.setParent(null); // 不好,因为 nodeB.getParent() will = null

不,nodeB.parent不会设置为null。Java 总是使用Pass by Value而不是pass by reference. 重复 10 次。

如果您传递引用,则通过引用的值传递它们。


让我们更详细地了解。

当你这样做时: -

nodeB.setParent(nodeA.getParent());

您只需创建对 的引用的副本nodeA parent,并将其存储在nodeB parent. 因此,您现在有两个引用nodeA parentobject。现在,当您设置nodeA parent为时null,它与 that 分离parent,但nodeB parent引用仍然存在。

于 2013-02-11T23:16:13.013 回答