Middle
86
questionbank
Какие существуют виды вложенных классов?
AI答案
sobes.tech AI
Статические вложенные классы и внутренние классы (нестатические вложенные классы).
-
Статические вложенные классы:
- Объявляются с ключевым словом
static. - Имеют доступ только к статическим членам (полям и методам) внешнего класса, включая приватные.
- Не имеют доступа к нестатическим членам внешнего класса напрямую.
- Могут быть инстанцированы без экземпляра внешнего класса.
class Outer { private static int staticVar = 10; private int instanceVar = 20; static class StaticNested { void display() { System.out.println("Static var: " + staticVar); // System.out.println("Instance var: " + instanceVar); // Ошибка компиляции } } } - Объявляются с ключевым словом
-
Внутренние классы (нестатические вложенные классы):
- Объявляются без ключевого слова
static. - Имеют полный доступ ко всем членам (статическим и нестатическим) внешнего класса, включая приватные.
- Не могут содержать статических членов (полей или методов), кроме финальных констант.
- Требуют наличия экземпляра внешнего класса для своего создания.
class Outer { private static int staticVar = 10; private int instanceVar = 20; class Inner { void display() { System.out.println("Static var: " + staticVar); System.out.println("Instance var: " + instanceVar); } } } - Объявляются без ключевого слова
-
Локальные классы:
- Объявляются внутри методов, конструкторов или блоков инициализации.
- Имеют доступ ко всем финальным и effectively final локальным переменным, а также к членам внешнего класса, в котором они определены.
- Область их видимости ограничена блоком, в котором они объявлены.
class Outer { void myMethod() { final int localVar = 5; // Effectively final class LocalInner { void display() { System.out.println("Local var: " + localVar); } } LocalInner local = new LocalInner(); local.display(); } } -
Анонимные классы:
- Локальные классы без имени.
- Создаются и инстанцируются одновременно.
- Часто используются для создания реализаций интерфейсов или расширения классов.
interface MyInterface { void doSomething(); } class Outer { void myMethod() { MyInterface anon = new MyInterface() { @Override public void doSomething() { System.out.println("Doing something anonymously."); } }; anon.doSomething(); } }
Основные отличия между статическими вложенными классами и внутренними классами:
| Характеристика | Статический вложенный класс | Внутренний класс |
|---|---|---|
| Ключевое слово | static |
Отсутствует |
| Доступ к членам | Только статические члены внешнего | Все члены внешнего класса |
| Создание экземпляра | Без экземпляра внешнего класса | Требуется экземпляр внешнего класса |
| Статические члены | Могут содержать | Не могут содержать (кроме констант) |