Обоснование ответа SCJP состоит в том, что в строке 6 в области действия arr
отсутствуют остальные операторы, которые на него ссылаются.При нормальных обстоятельствах это делает массив и его элементы пригодными для сборки мусора.
(Спецификация языка Java (12.6.1) говорит следующее:
"Aдостижимый объект - это любой объект, к которому можно получить доступ в любом потенциальном продолжающемся вычислении из любого живого потока. Могут быть разработаны оптимизирующие преобразования программы, которые уменьшают число достижимых объектов до тех, которые наивно считаются достижимыми.компилятор или генератор кода может установить переменную или параметр, которые больше не будут использоваться для обнуления, чтобы в будущем хранилище для такого объекта могло быть потенциально восстановимо. "
AsВы можете видеть, что настоящее определение достижимости на самом деле не основано на определении объема.)
Есть еще один поворот в этом вопросе ...
Если бы они присвоили i
myInt
, при автобоксировании будет использоваться Integer.valueOf(i)
, и этот метод записал бы объект Integer
в static
caче.Этот кэш привел бы к тому, что объект оставался достижимым ...
Однако экземпляр Integer
создается с использованием new
, поэтому кэширование не происходит.И объект является недоступным в строке 6.