对Java中的参考感到困惑

时间:2018-11-07 07:47:43

标签: java

我对nextroot.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

3 个答案:

答案 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];
    }
}