В 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;
}
}
Ответы
Ответ 1
Да, это хорошо. Из JLS раздел 6.6.1:
В противном случае, если член или конструктор объявлен private
, тогда доступ разрешен тогда и только тогда, когда он встречается внутри тела класса верхнего уровня (§7.6), который включает объявление члена или конструктора.
Вы даже можете обратиться к частному члену вложенного типа X в другом вложенном типе Y, если они разделяют класс верхнего уровня.
На уровне байт-кода, я считаю, что все это реализовано путем добавления синтетических методов доступа к пакетам.