Имеет ли внутренний (inner) класс в Java доступ к приватным полям внешнего класса?

«Имеет ли внутренний (inner) класс в Java доступ к приватным полям внешнего класса?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, имеет. Нестатический внутренний класс (inner class) обладает доступом ко всем членам внешнего класса (полям и методам), включая приватные (private). Это возможно потому, что внутренний класс неявно содержит ссылку на экземпляр внешнего класса.

Пример:

public class OuterClass {
    private String privateField = "Private Data";

    class InnerClass {
        void accessOuter() {
            // Внутренний класс может читать приватное поле внешнего
            System.out.println(privateField);
        }
    }
}

Как это работает: Компилятор Java на уровне байт-кода синтезирует методы доступа (например, access$000), чтобы внутренний класс мог обращаться к приватным членам внешнего. Это нарушение инкапсуляции на уровне языка, но оно разрешено спецификацией, так как внутренний класс является частью реализации внешнего.

Важно: Статический вложенный класс (static nested class) не имеет такого доступа, так как он не привязан к конкретному экземпляру внешнего класса.