术语“内部类”通常被认为是“需要封闭实例的嵌套类”。然而,JLS如下所述:
8.1.3.内部类和封闭实例
[...]
内部类包括本地(§14.3)、匿名(§15.9.5)和非静态成员类(§8.5)。
[...]
在静态上下文中声明的内部类的实例没有词法封闭实例。
此外, 15.9.5. 匿名类声明 [...]
匿名类始终是内部类(§8.1.3);它从不是静态的(§8.1.1、§8.5.1)。
内部类包括本地(§14.3)、匿名(§15.9.5)和非静态成员类(§8.5)。
[...]
在静态上下文中声明的内部类的实例没有词法封闭实例。
此外, 15.9.5. 匿名类声明 [...]
匿名类始终是内部类(§8.1.3);它从不是静态的(§8.1.1、§8.5.1)。
众所周知,在静态上下文中可以声明匿名类:
class A {
int t() { return 1; }
static A a = new A() { int t() { return 2; } };
}
简言之,new A() {}
是一个嵌套类,没有封闭的实例,在静态上下文中定义,但它不是一个静态嵌套类,而是一个内部类。
我们在日常使用中是否都赋予这些术语不恰当的含义?
有趣的相关点是,这个历史规范文档将术语“顶层”定义为“内部”的相反:
静态类成员和包成员都被称为顶层类。它们与内部类的区别在于,顶层类只能直接使用自己的实例变量。
然而,在通常的用法中,“顶层”被认为是“嵌套”的相反。
static
而不是添加它时会发生的事情。 - Ian Roberts