Назад к вопросам
Middle
66
questionbank

В чем различия между вложенными (nested) классами и внутренними (inner) классами в Java?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

  • Вложенные классы (Nested classes): Статические члены внешнего класса. Не имеют доступа к нестатическим членам (полям и методам) внешнего класса напрямую, только через экземпляр внешнего класса. Объявляются с ключевым словом static.

  • Внутренние классы (Inner classes): Нестатические члены внешнего класса. Имеют полный доступ ко всем членам (статическим и нестатическим) внешнего класса, включая приватные. Для создания экземпляра внутреннего класса нужен экземпляр внешнего класса. Не используют ключевое слово static.

Пример:

// Внешний класс
class Outer {
    private int outerField = 10;
    private static int staticOuterField = 20;

    // Статический вложенный класс
    static class StaticNestedClass {
        void display() {
            // Доступ только к статическим членам внешнего класса
            System.out.println("Static nested: " + staticOuterField);
            // Нет прямого доступа outerField
            // System.out.println(outerField); // Ошибка компиляции
        }
    }

    // Нестатический внутренний класс
    class InnerClass {
        void display() {
            // Доступ ко всем членам внешнего класса
            System.out.println("Inner: " + outerField);
            System.out.println("Inner (static): " + staticOuterField);
        }
    }
}

// Использование
public class Main {
    public static void main(String[] args) {
        // Создание экземпляра статического вложенного класса
        Outer.StaticNestedClass staticNested = new Outer.StaticNestedClass();
        staticNested.display();

        // Создание экземпляра внутреннего класса требует экземпляра внешнего класса
        Outer outer = new Outer();
        Outer.InnerClass inner = outer.new InnerClass();
        inner.display();
    }
}
Особенность Вложенный класс (Nested Class) Внутренний класс (Inner Class)
Ключевое слово static Нет
Доступ к членам внешнего класса Только статические Все
Требует экземпляр внешнего класса для создания экземпляра Нет Да
Связь с экземпляром внешнего класса Нет Да