Термин "внутренний класс" принято понимать как "вложенный класс, который требует включающего экземпляра". Тем не менее, JLS гласит следующее:
8.1.3. Внутренние классы и вложенные экземпляры
[...]
Внутренние классы включают в себя локальные (§14.3), анонимные (§15.9.5) и нестатические классы-члены (§8.5).
[...]
Экземпляр внутреннего класса, объявление которого происходит в статическом контексте, не имеет лексически заключенных экземпляров.
Также,
15.9.5. Объявления анонимных классов
[...]
Анонимный класс всегда является внутренним классом (§8.1.3); оно никогда не бывает
static
(§8.1.1, §8.5.1).
И хорошо известно, что анонимный класс может быть объявлен в статическом контексте:
class A {
int t() { return 1; }
static A a = new A() { int t() { return 2; } };
}
Чтобы описать это остро,
new A() {}
- это вложенный класс без включающего экземпляра, определенный в статическом контексте, но это не статический вложенный класс - это внутренний класс.
Все ли мы приписываем неподходящее значение этим терминам в повседневном использовании?
В качестве связанной точки интереса этот исторический документ спецификации определяет термин верхний уровень как противоположность внутреннего:
Классы, которые являются
static
членами класса, и классы, которые являются членами пакета, называются классами верхнего уровня. Они отличаются от внутренних классов тем, что класс верхнего уровня может напрямую использовать только свои собственные переменные экземпляра.
В то время как в общем использовании верхний уровень считается противоположностью вложенного.