实现和规范之间有区别。
我认为“除外” JLS声明
… 除了 非私有内部成员类…
措辞不佳。
这意味着, 不需要 编译器隐式声明一个表示该类的立即封闭实例的形式参数…但是 可以 。
为什么非私有内部成员类 需要 隐式形式参数?
从JLS
8.8.1开始:
成员类可能是由与类实例创建表达式的编译器不同的编译器发出的。因此,创建表达式的编译器必须有一种标准方法将引用(表示立即封闭的实例)传递给成员类的构造函数
例如,如果我使用第一个编译器编译此内部类:
package p1;public class Ctors { public class MyInner { }}如果我想用另一个编译器编译这个子类:
package p2;import p1.Ctors;public class SubCtors { public SubCtors() { new Ctors(); }}第二个编译器必须能够将默认构造函数与形式参数一起使用。在这种情况下,带有一个
SubCtors实例的封闭类的实例。
为什么在非私有内部成员类中 不需要 隐式形式参数?
因为非私有内部成员类始终由编译它的同一编译器访问。如您所示,无论类可见性如何,javac都会生成相同的构造函数,但这不是必需的。另一个编译器实现可以自由选择其他方式。
JLS
8.8.1还有一点,就是同一条线
在用于 本地类(不是在静态上下文中)
或匿名类的类实例创建表达式中,第15.9.2节指定了本地/匿名类的直接封闭实例。本地/匿名类必须由与类实例创建表达式相同的编译器发出。该编译器可以随心所欲地表示立即封闭的实例。
Java编程语言无需在本地/匿名类的构造函数中隐式声明参数。



