在Java中,超级构造函数调用是否有可能实际调用调用类中的构造函数?

时间:2011-01-08 17:38:22

标签: java inheritance constructor

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阻止了吗?

2 个答案:

答案 0 :(得分:2)

  

是否存在一个主表达式,它调用super()调用调用类的构造函数?

没有。没有办法转移super()来电相当于使用this()。 Primary的唯一原因是当超类是非静态内部类时提供实例化外部上下文。

主表达式不是选择构造函数或类 - 它只是传递某些构造函数所需的上下文信息(即非静态内部类所需的外部实例)。

编辑:

OP请求来源。我没有 - 我的答案仅仅基于我对规范的阅读,我认为这很清楚:

  

...关键字super ...用于调用直接超类的构造函数。

     

如果超类构造函数调用是合格的,则紧接在“.super”之前的主表达式p是......直接封闭的[外部]实例...如果p的类型不是,则编译时错误O [外类]或O的子类。

如果在super上有一个限定表达式,它只能用于返回超类的封闭类的实例(或者封闭类的子类的实例)超类)。限定表达式与响应super()调用哪个类的构造函数没有关系,即,没有值可以返回限定表达式,这将改变将其构造函数调用为super()的类 - super()将始终调用直接超类的构造函数。

答案 1 :(得分:0)

据我所知,Java中的构造函数不是虚拟的(基类不能从派生类中调用任何构造函数)。实际上,您可以在构造函数中调用方法,这些方法将像在最终对象上一样进行调用。但是这有可能引入一些微妙的错误(因为当从基类构造函数调用该方法时,没有对派生类成员执行初始化)。

选中此处以获得更完整的讨论:

http://www.codeguru.com/java/tij/tij0082.shtml