私有内部类的默认构造函数是否具有形式化参数?
警告#1:这实际上是一个潜在的两部分:首先,私有内部类的构造函数是否有形式参数?如果是,为什么JLS说它没有?如果不是,如何/为什么不呢?
警告#2:这个问题不是为了猜测。我只在寻找权威的答案。
默认构造函数在 JLS 8.8.9 中定义,其中声明(部分):
默认构造函数没有形式参数,除非在非私有内部成员类中,其中默认构造函数隐式声明一个形式参数,表示类的紧闭实例(§8.8.1,§15.9.2,§15.9.3)。
(着重号后加)
“非私有”位对我来说似乎很奇怪:为了让内部类访问其封闭类中定义的字段,它需要对该实例的引用。无论内部类是否为私有类,这都应该是相同的。
事实上,javac似乎同意我的观点,这与规范相矛盾。如果我编译这个:
public class Ctors {
private class MyInner {
}
}
...并运行 ,然后我们看到一个带有单个形式参数的构造函数,用于封闭类的实例:javap -c -private
$ javap -c -private Ctors\$MyInner
Compiled from "Ctors.java"
class Ctors$MyInner {
final Ctors this$0;
private Ctors$MyInner(Ctors);
Code:
0: aload_0
1: aload_1
2: putfield #1 // Field this$0:LCtors;
5: aload_0
6: invokespecial #2 // Method java/lang/Object."<init>":()V
9: return
}
作为参考,这是在Oracle JDK 1.8.0_05上。
所以JLS说私有内部成员类的默认构造函数没有正式参数,但javac/javap说它有一个。(我对事物最自然的工作方式的理解也说它应该有一个,因为价值很小。哪个是对的,为什么JLS明确排除了私有内部类?