Взято из подготовительной книги 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?
A. 0
B. 1
C. 2
D. Ошибка компиляции
Е. Невозможно узнать
F. Во время выполнения генерируется исключение
Правильный ответ: C — «Только один объект CardBoard (c1) подходит, но он имеет связанный с ним объект-оболочку Short, который также подходит».
Мой вопрос: почему c3 не подходит для сбора?
Мои мысли -
c1.go(c2) устанавливает локальную ссылочную переменную cb (которая является копией c2) в значение null, а затем возвращает cb, присвоенное c3. Я знаю, что ссылочная переменная для самого c2 не может быть изменена в методе, только объект, стоящий за ней. Однако мне кажется, что копия ссылочной переменной cb имеет значение null и присваивается c3. Почему в этом случае для c3 не задано возвращаемое значение null?