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

Как из вложенного класса получить доступ к полю внешнего класса?

Sobes Copilot

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

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

sobes.tech AI

Из нестатического вложенного класса (inner class) доступ к полю внешнего класса осуществляется напрямую по имени поля.

Из статического вложенного класса (static nested class) доступ к полю внешнего класса возможен только через ссылку на объект внешнего класса, так как статический вложенный класс не имеет неявной связи с экземпляром внешнего класса.

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

    // Нестатический вложенный класс
    class Inner {
        void accessOuterField() {
            // Доступ к полю внешнего класса напрямую
            System.out.println("From Inner class: " + outerField);
        }
    }

    // Статический вложенный класс
    static class StaticNested {
        // Не имеет прямого доступа к outerField
        void accessOuterField(Outer outerInstance) {
            // Доступ через ссылку на объект внешнего класса
            System.out.println("From StaticNested class: " + outerInstance.outerField);
        }
    }

    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.accessOuterField(); // Вывод: From Inner class: 10

        Outer.StaticNested staticNested = new Outer.StaticNested();
        staticNested.accessOuterField(outer); // Вывод: From StaticNested class: 10
    }
}

Для доступа к явному полю внешнего класса, если, например, у вложенного класса есть поле с таким же именем, можно использовать синтаксис Outer.this.fieldName.

class Outer {
    private int field = 10;

    class Inner {
        private int field = 20;

        void accessFields() {
            // Доступ к полю вложенного класса
            System.out.println("Inner field: " + field);
            // Доступ к полю внешнего класса
            System.out.println("Outer field: " + Outer.this.field);
        }
    }

    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.accessFields();
        // Вывод:
        // Inner field: 20
        // Outer field: 10
    }
}