Эталонное поведение - PullRequest
       16

Эталонное поведение

0 голосов
/ 31 октября 2019

У меня есть два экземпляра для одного и того же объекта, я сделал основной объект пустым, но ссылки все еще существуют. Будет хорошо, если кто-нибудь сможет мне объяснить, что происходит? Возможно, есть некоторые приемы, которые позволяют обнулить все ссылки после обнуления основного объекта, вместо того, чтобы вручную просматривать все экземпляры и делать их пустыми.

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
      }
    }

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Объект Node (когда вы делаете new Node<>()) создается в куче. Куча - это кусок памяти, в котором находятся все объекты. это управляется для вас временем выполнения Java (JRE). объект содержит переменные экземпляра item и next, которые являются двумя ссылками на другие объекты, которые также находятся в куче.

ссылки - это указатели на адреса в куче. item, next внутри узла - это ссылки на разные объекты. node, node2 и node3 являются ссылками на один и тот же объект. объект будет оставаться в куче до тех пор, пока на него указывает хотя бы одна ссылка. удаление объектов из кучи выполняется автоматически JRE. это то, что называется сборкой мусора.

нет автоматического способа получения списка ссылок на объект. Вы должны вручную поддерживать такой список.

0 голосов
/ 31 октября 2019

Вы создаете 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
...