Рассмотрим следующий фрагмент кода:
Файл: ListPool.java
package smc;
import smc.ListPool.MyLinkedList;
public class ListPool { // (1) Top-level class
public static class MyLinkedList { // (2) Static member class
private static String str = "test"; // (2')
private interface ILink { } // (3) Static member interface
public static class BiNode // (4) Static member class
implements IBiLink {
public static void printSimpleName() { // (5) Static method
System.out.println(BiNode.class.getSimpleName());
}
public void printName() { // (6) Instance method
System.out.println(this.getClass().getName());
}
} // end BiNode
} // end MyLinkedList
interface IBiLink
extends MyLinkedList.ILink { // (7) Static member interface
// private static class Traversal { } // (8) Compile-time error!
// Can only be public.
class BiTraversal { } // (9) Class is public and static
} // end IBiLink
public class SortedList { // (10) Non-static member class
private static class SortCriteria {} // (11) Static member class
}
public static void main(String[] args) {
String test = MyLinkedList.str; // (12)
}
}
Я удивлен, что (7) и (12) скомпилированы без ошибок, поскольку они обращаются к частному полю класса. Это что-то особенное, что статические вложенные классы привносят в Java?
Спецификация языка Java 6.6.1. Определение доступности: «Член (...) класса,... доступен, только если (i) класс,... доступен и (ii) член или конструктор объявлен для разрешения доступа: ..., член или конструктор объявляется закрытым. Доступ разрешен только в том случае, если выполняется одно из следующих условий: Доступ происходит из тела класса или интерфейса верхнего уровня, который заключает в себе объявление члена или конструктора. ... " (одно преимущество/причина для вложенных классов)




Если это внутренний или вложенный класс, даже члены private доступны для окружающего класса.
Все, что я вижу здесь, находится в контексте окружающего класса. Все они имеют доступ к
privateполям и методам друг друга, вот как это работает. Нет никакой разницы между доступом к приватному полю изListPoolили изMyLinkedList. Это все «один класс», поэтому у вас есть доступ ко всем закрытым членам.