Вопрос проверяет понимание вложенных классов в Java, их типов и особенностей использования для организации кода.
Вложенные классы (nested classes) в Java — это классы, объявленные внутри другого класса. Они позволяют логически сгруппировать классы, которые используются только в одном месте, улучшая инкапсуляцию и читаемость кода. Вложенные классы делятся на две основные категории: статические и нестатические (внутренние классы).
Статический вложенный класс объявляется с модификатором static. Он ведет себя как обычный класс, но находится в пространстве имен внешнего класса. Он не имеет доступа к нестатическим полям и методам внешнего класса напрямую, только через ссылку на объект внешнего класса.
class Outer {
private static String staticField = "static";
private String instanceField = "instance";
static class StaticNested {
void display() {
System.out.println(staticField); // доступно
// System.out.println(instanceField); // ошибка компиляции
}
}
}Нестатические вложенные классы называются внутренними. Они имеют доступ ко всем полям и методам внешнего класса, включая private, так как хранят неявную ссылку на объект внешнего класса. Экземпляр внутреннего класса может существовать только в контексте экземпляра внешнего класса.
class Outer {
private String message = "Hello";
class Inner {
void print() {
System.out.println(message); // доступ к private полю
}
}
}
// Использование:
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.print();Также существуют локальные классы (объявленные внутри блока кода) и анонимные классы (без имени, часто для реализации интерфейсов). Они относятся к внутренним классам и имеют доступ к полям внешнего класса, а также к локальным переменным, объявленным как final или эффективно final.
interface Greeting {
void sayHello();
}
class Outer {
void greet() {
final String name = "World";
Greeting greeting = new Greeting() {
@Override
public void sayHello() {
System.out.println("Hello, " + name);
}
};
greeting.sayHello();
}
}Вложенные классы полезны, когда класс тесно связан с другим классом и не используется отдельно. Они улучшают инкапсуляцию, скрывая реализацию, и уменьшают количество файлов. Статические вложенные классы подходят для вспомогательных утилит, а внутренние — для реализации итераторов или обработчиков событий. Используйте их осознанно, чтобы не усложнять код.