- Статические вложенные классы - Внутренние классы - Локальные классы - Анонимные классы ## Статические вложенные классы - Доступ только к статическим полям внешнего класса - Не требует экземпляра внешнего класса - Логическая группировка классов ```Java class Outer { static class Static { } } var object = new Outer.Static(); ``` ## Внутренние классы - Доступ ко всем полям внешнего класса - Связаны с экземпляром внешнего класса ```Java class Outer { private int field; class Inner { public int getOuterField() { return field; } } } Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); print(inner.getOuterField()); ``` ## Классы, вложенные в интерфейс - По умолчанию `public static` ```Java public interface Vehicle { void start(); class Engine { private int horsepower; public Engine(int horsepower) { this.horsepower = horsepower; } public void roar() { System.out.println("Roar"); } } } Vehicle.Engine myEngine = new Vehicle.Engine(150); myEngine.roar(); ``` ## Локальные классы - Объявляются внутри метода - Видимость только внутри метода - Нет [[Модификаторы|модификаторов]] ```Java class Outer { void outerMethod() { class Local { void innerMethod() { } } Local local = new Local(); local.innerMethod(); } } ``` ## Анонимные классы - Объявление и создание в одном выражении - Отсутствие имени класса - Реализация интерфейсов или наследование классов ```Java interface I { void method(); } I obj = new I() { @Override public void method() { print("Hello"); } }; obj.method(); ``` Дополнительно: [[Интерфейсы#Вложенные интерфейсы|про вложенные интерфейсы]]