Объект c3
изначально нулевой, поэтому нет никаких сомнений в том, чтобы вспомнить его, потому что он никогда не существовал в первую очередь. Сборщик мусора предназначен для очистки объектов, которые действительно существуют в куче.
Среди прочего, ссылка на c2
никогда не отбрасывается, и, следовательно, она не будет исправлена. Хотя кажется, что c2 обнуляется в операторе CardBoard c3 = c1.go(c2);
, это не так. Ссылка на c2
передана по значению, и хотя ссылка аннулирована, в основном методе существует ссылка на объект. Следовательно, он не будет исправлен.
Это оставляет нам c1
, который был явно аннулирован и, следовательно, имеет право на сбор. Однако c1 также содержит ссылку на историю переменных Short
, которая не имеет никаких входящих ссылок от какого-либо другого объекта. Это приводит к тому, что два объекта пригодны для очистки - один объект CardBoard и встроенный объект Short.