Взятые из SCJP 6 приготовительных книг -мусора - почему c3 не имеют прав на коллекцию в этом примере (SCJP 6)
Дана:
class CardBoard {
Short story = 200;
CardBoard go(CardBoard cb) {
cb = null;
return cb;
}
public static void main(String[] args) {
CardBoard c1 = new CardBoard();
CardBoard c2 = new CardBoard();
CardBoard c3 = c1.go(c2);
c1 = null;
// do Stuff
}
}
Когда // DoStuff достигнут, сколько объектов имеют право на GC?
А. 0
Б. 1
С. 2
Д. Сборник терпит неудачу
E. Это невозможно знать
F. An исключение выбрасывается во время выполнения
Правильный ответ: C - «Только один объект CardBoard (c1) имеет право, но у него есть связанный объект Short wrapper, который также имеет право».
Мой вопрос: почему c3 не подходит для сбора?
Мои мысли -
c1.go (c2) устанавливает локальную ссылочную переменную, Cb (который является копией c2), нулевое значение, а затем возвращает сЬ, который назначен на с3. Я знаю, что ссылочная переменная для c2 сама по себе не может быть изменена в методе, а только объект за ней. Однако мне кажется, что копия ссылочной переменной cb установлена в значение null и назначена на c3. Почему c3 не установлен в возвращаемый null в этом экземпляре?
Хм. Я не уверен, что мне нравится говорить: «Короткая обложка тоже лишена прав». Я понимаю, что прямо сейчас объект Short ссылается на объект CardBoard. Ссылка не удаляется, пока CardBoard не получит GCed правильно? Может кто-нибудь прокомментировать это?После того, как CardBoard получит GCed, теперь Short будет eligibile, но в данный момент я не думаю, что это – Cruncher
На короткий объект ссылается картонный объект, однако из-за того, что это недоступно для живой нити поскольку ссылка, которая содержит ссылку, является нулевой, она также имеет право (изолированная ссылка) – SMC