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{
}
}
如上所述here,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()
。为什么会如此不同?
答案 0 :(得分:3)
尝试在第二个示例中调用B.Inner(B)
。
找不到它,因为只有B.Inner(B, B)
。如果您的构造函数为B.Inner()
,则会将其更改为Inner(B)
...如果您的构造函数为B.Inner(B)
,则会将其更改为B.Inner(B, B)
。
请注意,隐藏参数实际上是一个实现细节,除非您正在研究Java编译器的工作原理,否则您不需要知道它存在。