【发布时间】:2013-12-26 10:59:33
【问题描述】:
术语内部类通常被认为是指“需要封闭实例的嵌套类”。但是,JLS 声明如下:
8.1.3. Inner Classes and Enclosing Instances
[...]
内部类包括本地(§14.3)、匿名(§15.9.5)和非静态成员类(§8.5)。
[...]
在静态上下文中声明的内部类的实例没有词法封闭实例。
还有,
15.9.5. Anonymous Class Declarations
[...]
匿名类始终是内部类(第 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() {} 是一个没有封闭实例的嵌套类,在静态上下文中定义,但它不是静态嵌套类——它是一个内部类。
在日常使用中,我们是否都给这些术语赋予了不恰当的含义?
作为一个相关的兴趣点,this historical specification document 将术语 top-level 定义为 inner 的对立面:
static类成员的类和哪些类 是包成员都称为顶级类。它们不同于内 顶级类只能直接使用它自己的实例 变量。
而在常见用法中,top-level 被视为与 nested 相反。
【问题讨论】:
-
看起来术语已经被不必要地混淆了......
-
问题是,我们都依赖该术语进行交流 :) 随着时间的推移,我们似乎已经为自己制定了一个不同的术语,它更有用。
-
当然。这是我认为改变规范以匹配社区而不是相反的情况之一。
-
你最后的第 1 点和第 2 点是当你 删除
static而不是当你添加它时发生的。 -
@IanRoberts 谢谢,已更正(在答案中,我已经转移了该文本)。