繁体   English   中英

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

[英]In Java, is it possible for a super constructor invocation actually invoke a constructor in the calling class?

超级构造函数调用定义

[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防止这种情况?

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

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

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

编辑:

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

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

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

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

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

检查这个以获得更完整的讨论:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM