Почему мы используем ключевое слово final с анонимными внутренними классами?
В настоящее время я готовлю S (O) CJP с книгой Sierra & Bates.
Что касается внутренних классов (локальный или анонимный метод), они говорят, что мы не можем получить доступ к локальным переменным, потому что они живут в стеке, в то время как класс живет в куче и может быть возвращен методом, а затем попытаться получить доступ к этим переменным. которые находятся в стеке, но больше не существуют, так как метод завершился .
Как мы все знаем, мы можем обойти это, используя ключевое слово final. Это то, что они говорят в книге, но на самом деле они не объясняют, каков эффект этого ключевого слова final . Насколько я знаю, использование ключевого слова final в локальной переменной метода не делает его живым в куче. .. Итак, как класс сможет получить доступ к конечной переменной, которая все еще находится в стеке, когда стека больше не может быть .
Я предполагаю, что внутри внутреннего класса должна быть какая-то «копия» этой последней локальной переменной. Поскольку значение не может измениться, почему бы не продублировать эту информацию . Может ли кто-нибудь подтвердить это или сказать мне, что я что-то упускаю?
Уровень 23. Ответы на вопросы к собеседованию по теме уровня
Если определяется анонимный внутренний класс и ему нужно при этом использовать объекты, определенные вне этого внутреннего класса, компилятор требует, чтобы переданные на них ссылки объявлялись неизменными (final). Без такого объявления вы получите сообщение об ошибке при компиляции программы.
Как правильно создать объект внутреннего класса?
Внутренние (не статические) классы, как переменные и методы связаны с объектом внешнего класса. Внутренние классы так же имеют прямой доступ к полям внешнего класса. Такие классы не могут содержать в себе статические методы и поля. Внутренние классы не могут существовать без экземпляра внешнего. Для создания объекта:
Как правильно создать объект вложенного класса?
Синтаксис создания объекта вложенного класса:
Можно ли создавать статические методы/переменные во внутреннем классе?
Статические методы/переменные объявлять во внутреннем классе (не вложенном) нельзя.
Внутренние (не статические) классы, как переменные и методы связаны с объектом внешнего класса. Такие классы не могут содержать в себе статические методы и поля.
Назовите три любых внутренних класса?
- private static class Holder —вложенный класс HashMap из java.util .
- В интерфейсе Map есть interface Entry<K,V> , который опять же в HashMap и реализуется в другом вложенном классе static class Entry<K,V> implements Map.Entry<K,V> .
- private static class IntegerCache в классе Integer .
Как внутренние классы решают проблему множественного наследования в Java?
Т.к. множественное наследование классов в Java запрещено, эту проблему решают с помощью внутренних классов: в нужном нам классе мы объявляем внутренний класс и наследуем его от требуемого класса. Пример:
Чем отличаются анонимные классы, созданные на основе интерфейса и на основе класса?
- При объявлении класса будет создан новый класс, производный от указанного класса при использовании в качестве базы другого класса, или реализующий интерфейс при использовании в качестве базы интерфейса.
- При инициализации будет создан новый объект и на него будет возвращения ссылка: анонимный класс является конкретным.
Таким образом, единственное отличие в анонимных классах, созданных на основе интерфейса и класса, заключается в количестве абстракных методов, которые необходимо реализовать.
Инициализации анонимного класса на основе интерфейса потребует реализации каждого метода, в то время как при инициализации анонимного класса на основе абстрактного/конкретного класса позволит изменить поведение за счет перегрузки методов и потребует реализации абстракных методов.
Какие бывают внутренние классы? Как правильно создавать объект вложенного класса? Как правильно создавать объект внутреннего класса? Зачем использовать ключевое слово final при создании анонимных классов? Во что компилируется анонимный внутренний класс?
Внутренние классы бывают следующих типов:
-вложенные (статические) внутренние классы;
-внутренние классы члены;
-локальные классы;
-анонимные классы.
Имеют доступ только к статическим полям и методам содержащего их класса. Для создания экземпляра не требуется объект внешнего класса.
Вложенные статические классы в основном используются для группировки. Пример из кода компилируется в два класса OuterClass$InnerStaticClass.class и OuterClass.class.
Данному виду внутренних классов требуется экземпляр внешнего класса. Он имеет доступ ко всем полям и методам экземпляра внешнего класса, в том числе приватным. Также он может обращаться к статическим методам и полям обрамляющего класса.
Во внутренних классах-членах нельзя объявлять статические поля, статические методы и перечисления.
Локальные классы создаются в блоках инициализации и в статических блоках java кода. Но чаще всего они используются внутри методов. Они могут обращаться только к финальным полям обрамляющего класса и аргументам метода. Его нельзя создать за пределами блока кода, в котором он описан. Локальный класс не может быть private, public, protected или static.
Анонимные классы используются в месте их создания. Они не имеют имени. Являясь частным случаем локального класса они приемствуют все ограничения локальных классов. Также могут обращаться к финальным локальным переменным внешнего класса и ко всем полям обрамляющего класса. Локальные переменные должны быть финальными для того, что бы пользователь класса был уверен в том, что пока он работает с данными они не изменятся во внешнем коде, что их состояние остаётся актуальным на всём протяжении жизни анонимного класса.
После компиляции анонимный класс из примера выше выглядит как TestAnonimClass$1.class, но в программе мы не можем обратиться к нему по такому имени.