我对next
与root.children[0]
的值为何为何不同感到困惑?以我的理解,next
指向root.children[0]
。因此,如果更改root.children[0]
的值,则next
也应更改。
public class MyClass {
public static void main(String args[]) {
Node root = new Node();
Node next = root.children[0];
root.children[0] = new Node();
System.out.println(root.children[0]);
System.out.println(next);
}
public static class Node {
Node[] children = new Node[1];
}
}
输出
MyClass$Node@e6ea0c6
null
答案 0 :(得分:4)
让我们逐行剖析此代码:
Node root = new Node();
您创建了一个新的Node
对象。该对象的长度为children
的数组为1。由于尚未为children
分配任何内容,因此该数组包含单个元素null
。
Node next = root.children[0];
正如我所说,children[0]
为空,因此next
现在为空。请注意,在这一行中,您没有这样做是为了使next
始终 指向与{{1} }。您只使children[0]
指向了与next
当时指向 的同一点。
children[0]
现在为root.children[0] = new Node();
分配了一个非空值。请注意,这不会更改children[0]
的值。
答案 1 :(得分:3)
这样考虑一下,我将内存中的对象标记为{},并将引用标记为->
因此,您从next = root.children[0]
开始,此时root.children[0] -> null
,它指向内存中没有任何内容,也没有对象,因此,下一步->空。
然后您进行root.children[0] -> {a new Node}
,但是下一个仍然是next -> null
,它没有指向同一对象,它不是root.children[0]
的快捷方式,不是next -> root.children[0] -> {a new Node}
,接下来指向一无所有
如果您有root.children[0] -> {a new Node}
,然后再进行next = root.children[0]
,那么下一个将指向next -> {a new Node}
,但是如果您现在root.children[0] = new Node()
又会导致{{1} }
然后下一个不指向该较新的节点
当您将对象的引用分配给变量时,通过执行root.children[0] -> {a newer Node}
在内存中的某个位置创建一个新对象,并使用=告诉变量指向该变量,该变量将不会始终指向内存中的同一地址。到新分配的对象
答案 2 :(得分:0)
当前,root.children[0]
仅具有引用而不是对象。因此,您需要首先将孩子添加到根节点,然后在我更改为以下代码后进行分配。
public class MyClass {
public static void main(String args[]) {
Node root = new Node();
root.children[0] = new Node();
Node next = root.children[0];
System.out.println(root.children[0]);
System.out.println(next);
}
public static class Node {
Node[] children = new Node[1];
}
}