我知道java中内部类都一定持有其封闭实例的引用,否则内部类就无法访问其封闭实例。
并且一开始,我认为:
"内部类都一定持有其封闭实例的引用"
其实就是
”内部类需要一个表示该类的封闭实例的隐式参数“。
换句话说,最开始,我认为这二者是等价的。
后来,通过与他人的交流,以及更仔细的阅读java语言规范,我发现两者完全是两码事:
java语言规范中有这样一段话:
The rationale for why only this kind of class has an implicitly declared constructor
parameter is subtle. The following explanation may be helpful:
- In a class instance creation expression for a non-private inner member class, §15.9.2
specifies the immediately enclosing instance of the member class. The member class
may have been emitted by a compiler which is different than the compiler of the class
instance creation expression. Therefore, there must be a standard way for the compiler
of the creation expression to pass a reference (representing the immediately enclosing
instance) to the member class's constructor. Consequently, the Java programming
language deems in this section that a non-private inner member class's constructor
implicitly declares an initial parameter for the immediately enclosing instance. §15.9.3
specifies that the instance is passed to the constructor.
.......
翻译过来就是:
为什么只有这种类有一个隐式声明的构造函数形参的基本原理是微妙的。以下解释可能会有所帮助:
1.在非私有内部成员类的类实例创建表达式中,§15.9.2 指定了成员类的直接封闭实例。
成员类可能是由与该类实例创建表达式的编译器不同的编译器生成的。
因此,创建表达式的编译器必须有一种标准方法将代表直接封闭实例的引用传递给成员类的构造函数。
所以,在本节中,Java 编程语言认为非私有内部成员类的构造函数隐式地声明了一个针对直接封闭实例的初始参数。§15.9.3 指定将该实例传递给构造函数。
显然,这段话要解释的内容应当是:
为什么非私有内部类需要一个表示该类的封闭实例的隐式参数。
但我无法理解它说的原因,具体在于:
非私有内部类需要一个表示该类的封闭实例的隐式参数 和 成员类可能是由与该类实例创建表达式的编译器不同的编译器生成的 这二者之间有什么因果关系?
(附注:我怀疑规范的这一部分不是解释为什么非私有内部类需要一个表示该类的封闭实例的隐式参数,但是规范不得不让我打消这种怀疑)