Какие бывают внутренние классы?
- Вложенные классы делятся на два вида: статические и не статические.
- Вложенные классы, объявленные как статические называются вложенными статическими (static nested classes).
- Вложенные не статические классы называются внутренними (inner classes).
Во что компилируется анонимный внутренний класс?
Во внутренний не статический класс
Зачем использовать ключевое слово
finalпри создании анонимных классов?Если определяется анонимный внутренний класс и ему нужно при этом использовать объекты, определенные вне этого внутреннего класса, компилятор требует, чтобы переданные на них ссылки объявлялись неизменными (final). Без такого объявления вы получите сообщение об ошибке при компиляции программы.
Как правильно создать объект внутреннего класса?
Внутренние (не статические) классы, как переменные и методы связаны с объектом внешнего класса. Внутренние классы так же имеют прямой доступ к полям внешнего класса. Такие классы не могут содержать в себе статические методы и поля. Внутренние классы не могут существовать без экземпляра внешнего. Для создания объекта:
Outer outer = new Outer(); Innter inner = outer.new Inner();Как правильно создать объект вложенного класса?
Синтаксис создания объекта вложенного класса:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();Можно ли создавать статические методы/переменные во внутреннем классе?
Статические методы/переменные объявлять во внутреннем классе (не вложенном) нельзя.
Внутренние (не статические) классы, как переменные и методы связаны с объектом внешнего класса. Такие классы не могут содержать в себе статические методы и поля.
Назовите три любых внутренних класса?
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 запрещено, эту проблему решают с помощью внутренних классов: в нужном нам классе мы объявляем внутренний класс и наследуем его от требуемого класса. Пример:
class Tiger extends Cat { public void tigerRun() { ..... } public void startTiger() { TigerThread thread = new TigerThread(); thread.start(); } class TigerThread extends Thread { public void run() { tigerRun(); } } }Чем отличаются анонимные классы, созданные на основе интерфейса и на основе класса?
Анонимный класс согласно JLS 15.9.5 представляют собой выражение, в котором объявление нового класса и его инициализация совмещены:
- При объявлении класса будет создан новый класс, производный от указанного класса при использовании в качестве базы другого класса, или реализующий интерфейс при использовании в качестве базы интерфейса.
- При инициализации будет создан новый объект и на него будет возвращения ссылка: анонимный класс является конкретным.
Таким образом, единственное отличие в анонимных классах, созданных на основе интерфейса и класса, заключается в количестве абстракных методов, которые необходимо реализовать.
Инициализации анонимного класса на основе интерфейса потребует реализации каждого метода, в то время как при инициализации анонимного класса на основе абстрактного/конкретного класса позволит изменить поведение за счет перегрузки методов и потребует реализации абстракных методов.
Можно ли создать анонимный статический вложенный класс?
Нет, статической становится только переменная, но не класс.
Зепп Бранниган
80 уровень
Уровень 23. Ответы на вопросы к собеседованию по теме уровня
Комментарии (8)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
AliransaРаботает в стажировка
4 сентября 2024, 09:11
Назовите три любых внутренних класса. из того, что нам хоть как-то встречалось и понятно
public class HashMap<K,V> содержит:
final class KeySet
final class Values
final class EntrySet
abstract class HashIterator
final class KeyIterator
final class ValueIterator
public final class String содержит:
private static class CaseInsensitiveComparator
public final class Integer содержит
private static class IntegerCache
0
Viter
5 марта 2023, 19:23
Некоторые ответы устарели ввиду изменений в java:
"Зачем использовать ключевое слово final при создании анонимных классов?"
Это необязательно
"Можно ли создать анонимный статический вложенный класс?"
Можно.
"Можно ли создавать статические методы/переменные во внутреннем классе?"
Можно.
+9
Сергей Смирнов
5 июля 2022, 06:03
По поводу второго вопроса. В документации оракл к анонимным классам приводиться такое описание: "They enable you to declare and instantiate a class at the same time.", что означает, что мы можем объявить и создать экземпляр класса одновременно, что вообщем то и происходит при использовании анонимных классов. Так вот, во что все таки компилируется анонимный класс? Во внутренний не статический класс или в экземпляр этого класса?
0
Sergey
22 августа 2021, 11:54
Не могу я понять.Воту меня джава 8 стоит. Во всех 4 типах могу создать перменные и сатические и обычные
+2
ArtemG Backend Developer
3 сентября 2021, 08:55
В Java 7 так и было. Невозможно было добавлять static поля и методы во внутренние классы. В версии языка Java 8 появилась возможность создавать static final поля - они же константы. С версии Java 16 ограничения языка для внутренних классов были ослаблены еще больше и теперь можно объявлять static поля и методы во внутренних классах.
Конкретно по твоему вопросу и версии Java 8. Ты создаешь не просто static, а static final поля - константы, которые обязаны быть проинициализированы при объявлении (либо в конструкторе). Таким образом, static final поле проинициализированное значение, отправлено в память и к нему можно обратиться без создания экземпляра внешнего класса. Если бы поле было просто static (что невозможно в версии Java 8), то возникало бы противоречие: с одной стороны, раз оно static, к нему можно обратиться из любого места программы по имени класса, в котором оно содержится, с другой стороны - внутреннего класса не существует, пока не создан экземпляр внешнего класса. Однако static final поле создается сразу же после инициализации, а значит оно существует до того, как было создан хотя бы один экземпляр внешнего класса, мало того, оно гарантированно неизменяемое, а значит к нему можно безопасно обращаться)
Вообще советую почитать Джошуа Блоха - там эти моменты более глубоко раскрыты. А для затравки можно прочесть этот цикл статей на хабре, он довольно неплохой.
+7
Alexey Prilessky
27 апреля 2020, 12:24
9 пункт : изменить поведение не за счёт перегрузки, а за счет переопределения
+7
Tom Riddle
31 мая 2019, 09:26
Чем отличаются анонимные классы, созданные на основе интерфейса и на основе класса?
Добавил бы. Если в программе используется анонимный класс на основе интерфейса с одним методом, то его можно заменить лямбда выражением. С анонимным классом на основе другого класса такого варианта не предоставляется по естественным причинам.
+5
Ilya Sukhov
24 февраля 2019, 07:44
Только мне кажется, что ответ на первый вопрос не содержит ответа на первый вопрос?
Внутренние (inner) классы бывают:
1) Просто внутренние классы (по определению - вложенные не-статические)
2) Локальные(local) классы (по определению - внутренние, описанные в блоке кода)
3) Анонимные(anonymous) классы (по определению - внутренние, без имени)
2 и 3 являются особыми разновидностями 1
https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
+22