Подтвердить что ты не робот

В Java-вложенных классах может ли закрытый класс получить доступ к закрытым членам внутренних классов?

В Java внутренний класс может получить доступ к закрытым членам охватывающего класса. Но может ли внешний класс получить доступ к частным членам внутреннего класса? Это независимо от того, является ли внутренний класс статическим или нет. Я думал, что это неверно, но следующий код, похоже, компилируется и работает нормально.

public class Outer {
    class Inner {
        private int i = 0;
        private Inner() {}
    }

    public static void main(String[] args) {
        Outer o = new Outer();
        Outer.Inner oi = o.new Inner();
        oi.i = 10;
    }
}
4b9b3361

Ответ 1

Да, это хорошо. Из JLS раздел 6.6.1:

В противном случае, если член или конструктор объявлен private, тогда доступ разрешен тогда и только тогда, когда он встречается внутри тела класса верхнего уровня (§7.6), который включает объявление члена или конструктора.

Вы даже можете обратиться к частному члену вложенного типа X в другом вложенном типе Y, если они разделяют класс верхнего уровня.

На уровне байт-кода, я считаю, что все это реализовано путем добавления синтетических методов доступа к пакетам.