每个内部类都需要一个封闭的实例吗?
术语内部类通常表示“需要封闭实例的嵌套类”。但是,JLS声明如下:
8.1.3. 内部类和封闭实例
[...]
内部类包括本地类 (§14.3)、匿名类 (§15.9.5) 和非静态成员类 (§8.5)。
[...]
其声明发生在静态上下文中的内部类的实例没有词法封闭实例。
也
15.9.5. 匿名类声明
[...]
匿名类始终是内部类 (§8.1.3);它永远不会(§8.1.1,§8.5.1)。
static
众所周知,匿名类可以在静态上下文中声明:
class A {
int t() { return 1; }
static A a = new A() { int t() { return 2; } };
}
为了凄美地描述它,
new A() {}
是一个没有封闭实例的嵌套类,在静态上下文中定义,但它不是静态嵌套类,而是一个内部类。
我们是否都在日常使用中为这些术语赋予不适当的含义?
作为相关的兴趣点,此历史规范文档将术语顶级定义为与内部相反:
作为类成员的类和作为包成员的类都称为顶级类。它们与内部类的不同之处在于,顶级类只能直接使用自己的实例变量。
static
而在通常的用法中,顶级被认为是嵌套的反面。