JLS说:
非私有内部成员类的构造函数隐式声明,作为第一个形式参数,一个表示立即封闭类的实例。
好的,如果我们写以下内容:
A类:
package org.gradle;
public class A extends B.Inner{
public A(B b){
b.super(); //OK, invoke B.inner(B)
}
}
B类:
package org.gradle;
public class B{
public class Inner{
}
}
正如这里所说的,b.super()
实际上调用了B.Inner(B)
。
但是如果我们写
B类:
package org.gradle;
public class B {
class Inner{
public Inner(B b){
System.out.println("Inner(B)");
}
}
}
A类:
package org.gradle;
public class A extends B.Inner{
public A(B b) {
b.super(); //The constructor B.Inner() is undefined
}
}
因此,在后一个示例中,b.super()
尝试调用B.Inner()
。为什么这么不同?
在第二个示例中,它确实尝试调用B.Inner(B)
。
它找不到它,因为只有一个B.Inner(B, B)
。如果您的构造函数是B.Inner()
,那么它将更改为Inner(B)
。。。如果你的构造函数是B.Inner(B)
,那么它就会变为B.Inner(B, B)
。
请注意,隐藏参数实际上是一个实现细节,除非您正在研究Java编译器的工作原理,否则您不需要知道它的存在。