Могут ли вложенные классы во вложенных классах Java обращаться к закрытым членам внутренних классов? - PullRequest
19 голосов
/ 08 февраля 2010

В 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;
    }
}

1 Ответ

24 голосов
/ 08 февраля 2010

Да, все в порядке. Из JLS, раздел 6.6.1 :

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

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

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

...