Почему мы используем ключевое слово final с анонимными внутренними классами? - PullRequest
23 голосов
/ 16 августа 2011

В настоящее время я готовлю S (O) CJP с книгой Sierra & Bates.

Что касается внутренних классов (метод локальный или анонимный), они говорят, что мы не можем получить доступ к локальным переменным, потому чтоони живут в стеке, в то время как класс живет в куче и могут быть возвращены методом, а затем пытаются получить доступ к этим переменным, которые находятся в стеке, но больше не существуют, так как метод завершился ...

Как мы все знаем, мы можем обойти это, используя ключевое слово final.Это то, что они говорят в книге, но они на самом деле не объясняют, каково действие этого ключевого слова final ... Насколько я знаю, использование последнего ключевого слова в локальной переменной метода не позволяет ему жить в куче... Так как же класс сможет получить доступ к конечной переменной, которая все еще живет в стеке, в то время как в стеке больше не может быть ???

Полагаю, должна быть какая-то "копия" этого финалалокальная переменная внутри внутреннего класса.Поскольку значение не может измениться, почему бы не дублировать эту информацию ... Может кто-то подтвердить это или сказать мне, если я что-то упустил?

Ответы [ 2 ]

18 голосов
/ 16 августа 2011

Ваша интуиция верна, поскольку переменная является окончательной, ее можно безопасно скопировать.Конечно, для ссылочных типов это означает копирование ссылки на объект, а не на объект, на который он ссылается.

11 голосов
/ 16 августа 2011

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

Смотри, например, http://tech -read.com / 2008/06/19 / почему-внутрипартийный класс может доступ только финал переменного /

...