Почему мы используем ключевое слово final с анонимными внутренними классами?

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

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

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

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

Ответ 1

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

Ответ 2

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

См. http://tech-read.com/2008/06/19/why-inner-class-can-access-only-final-variable/