Терминология Java Lang Spec в этой части достаточно запутана. Авторы различают nested (§8), inner (§8.1.3), local (§14.3), member (§8.5, §9.5), anonimous (§15.9) classes.
Мы следуем терминологии Java Lang Spec, но будем рассматривать только static-nested/innes + anonimous classes.
nested / inner classes
"A nested class is any class whose declaration occurs within the body of another class or interface."
"An inner class is a nested class that is not explicitly or implicitly declared static."
inner classses - это подмножество nested classes, называемое non-static nested class
дополнением inner classses (=non-static nested class) до nested classes являются static nested classes
inner class == non-static nested class
nested classes \ inner classes == static nested class
1. Нарушение инкапсуляции: и inner classes (non-static nested classes) и static nested classes имеют доступ ко всем членам outer class с любыми модификаторами доступа (public, protected, package private(=default), private).
2. Неявная ссылка на экземпляр outer-класса:
Следствия:
2.1. Если сохранилась ссылка на inner class, то не может быть удален outer class
2.2. Не можем создать экземпляр inner class, не имея экземпляр outer class
Уточнение:
2.3. У одного экземпляра inner class есть только один непосредственный экземпляр outer class, но у экземпляра outer class может быть 0, 1, 2, ... любое количество экземпляров inner class.
2.4. Почему ссылаемые ?сущности? должны быть final? Где хранятся переменные из стека?
3. Имя класса: и для inner (=non-static nested) и для static nested классов полное имя класса включает имя outer класса.
Следствия: