Он не имеет ничего общего с перечислением - он имеет отношение к закрытому доступу от содержащего типа до вложенного типа.
Из спецификации языка Java, раздел 6.6.1 :
В противном случае, если член или конструктор объявлен private
, тогда доступ разрешается тогда и только тогда, когда он происходит в теле класса верхнего уровня (§7.6), который включает в себя объявление члена или конструктора.
Например, это также верно:
public class Test {
public static void main(String[] args) {
Nested nested = new Nested();
System.out.println(nested.x);
}
private static class Nested {
private int x;
}
}
Интересно, что C # работает немного по-другому - в C # закрытый член доступен только внутри текста программы этого типа, в том числе из любых вложенных типов. Таким образом, приведенный выше код Java не будет работать, но это будет:
// C#, not Java!
public class Test
{
private int x;
public class Nested
{
public Nested(Test t)
{
// Access to outer private variable from nested type
Console.WriteLine(t.x);
}
}
}
... но если вы просто измените Console.WriteLine на System.out.println, скомпилирует в Java. Так что Java с частными членами немного слабее, чем C #.