【问题标题】:Reference behaviour参考行为
【发布时间】:2019-10-31 06:50:00
【问题描述】:

我有同一个对象的两个实例,我将主对象设为空,但引用仍然存在。 太好了,如果有人可以向我解释,发生了什么?也许有一些技术,允许在使主对象为空后使所有引用为空,而不是手动遍历所有实例并使它们为空。

public class Node <Item> {
        Item item;
        Node next;
    }

    public class JavaApplication1 {
        public static void main(String[] args) {
           Node<Integer> node = new Node<>();
           Node<Integer> node2 = new Node<>();
           Node<Integer> node3 = new Node<>();
           node.item = 1;

           node2 = node;
           node3 = node;
           node = null;

           //reference still exists in node2/node3 instances
           System.out.print(node2.item); // show 1
           System.out.print(node3.item); // show 1
      }
    }

【问题讨论】:

  • “我有同一个对象的两个实例”。不,你有两个对同一个对象/实例的引用。

标签: java reference


【解决方案1】:

Node 对象(当您执行 new Node&lt;&gt;() 时)在堆中创建。堆是所有对象都驻留的一块内存。它由 java 运行时 (JRE) 为您管理。该对象包含实例变量itemnext,它们恰好是对同样驻留在堆中的其他对象的两个引用。

引用是指向堆中地址的指针。 Node 内部的itemnext 是对不同对象的引用。 nodenode2node3 是对同一个对象的引用。 只要至少有一个引用指向该对象,该对象就会保留在堆中。从堆中删除对象是由 JRE 自动完成的。这就是所谓的垃圾收集。

没有自动获取对象引用列表的技术。您必须手动维护这样的列表。

【讨论】:

    【解决方案2】:

    您创建了 3 个类 Node 的实例。为此,我们将它们称为 N1、N2 和 N3。

    您的代码:

    Node<Integer> node = new Node<>();  // node refers to N1
    Node<Integer> node2 = new Node<>(); // node2 refers to N2
    Node<Integer> node3 = new Node<>(); // node3 refers to N3
    node.item = 1; // node refers to N1, so N1.item is now 1
    
    node2 = node; // node2 now refers to N1
                  // since no reference exists to N2, it will be deleted by the JVM
    node3 = node; // node2 now refers to N1
                  // since no reference exists to N3, it will be deleted by the JVM
    node = null;  // node is now null
    
    //reference still exists in node2/node3 instances
    System.out.print(node2.item); // show 1, because node2 is referring to N1, and N1.item is 1
    System.out.print(node3.item); // show 1, because node3 is referring to N1, and N1.item is 1
    

    【讨论】:

    • 我认为您应该澄清 N1 究竟发生了什么,因为他的逻辑(我猜是基于 C 吗?)是“N1 为空,那么为什么 N1.item 为 1?” “java没有真正的引用,通过pointer1 = pointer2你做的和你在C中做的不一样”等等。
    • @Ssr1369 看来你根本不明白我的回答。 N1 是我的对象实例的名称标签。它代表对象本身(基本上就是对象的分配内存),不能是null,和node变量无关,可以是null。此外,OP 从未说过“N1 为空”。
    • 我明白了,提出问题的人没有,因为你没有澄清你背后的概念“它代表对象并且不能为空,而节点变量可以为空"。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    相关资源
    最近更新 更多