Super constructor invocation definition:
[Primary.] [NonWildTypeArguments] super ( ArgumentListopt ) ;
超级构造函数调用可以以Primary
表达式为前缀。示例(取自JLS):
class Outer {
class Inner{ }
}
class ChildOfInner extends Outer.Inner {
ChildOfInner() {
(new Outer()).super(); // (new Outer()) is the Primary
}
}
是否存在一个Primary
表达式,它调用super()调用调用类的构造函数?或Java阻止了吗?
答案 0 :(得分:2)
是否存在一个主表达式,它调用super()调用调用类的构造函数?
没有。没有办法转移super()
来电相当于使用this()
。 Primary的唯一原因是当超类是非静态内部类时提供实例化外部上下文。
主表达式不是选择构造函数或类 - 它只是传递某些构造函数所需的上下文信息(即非静态内部类所需的外部实例)。
编辑:
OP请求来源。我没有 - 我的答案仅仅基于我对规范的阅读,我认为这很清楚:
...关键字super ...用于调用直接超类的构造函数。
如果超类构造函数调用是合格的,则紧接在“.super”之前的主表达式p是......直接封闭的[外部]实例...如果p的类型不是,则编译时错误O [外类]或O的子类。
如果在super
上有一个限定表达式,它只能用于返回超类的封闭类的实例(或者封闭类的子类的实例)超类)。限定表达式与响应super()
调用哪个类的构造函数没有关系,即,没有值可以返回限定表达式,这将改变将其构造函数调用为super()
的类 - super()
将始终调用直接超类的构造函数。
答案 1 :(得分:0)
据我所知,Java中的构造函数不是虚拟的(基类不能从派生类中调用任何构造函数)。实际上,您可以在构造函数中调用方法,这些方法将像在最终对象上一样进行调用。但是这有可能引入一些微妙的错误(因为当从基类构造函数调用该方法时,没有对派生类成员执行初始化)。
选中此处以获得更完整的讨论: