在Java中,调用父类构造函数时是否可能实际上调用了调用类的构造函数?

3

超级构造函数调用定义:

[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()调用的类。 - John Assymptoth
2个回答

2
是否存在一种主要表达式可以使对super()的调用成为调用调用类的构造函数?
没有。 没有办法将super()调用转换为使用this()的等效方式。 Primary的唯一原因是在超类是非静态内部类时提供实例化外部上下文。
主要表达式不是选择构造函数或类 - 它只是传递一些构造函数所需的上下文信息(即非静态内部类所需的外部实例)。
编辑:OP要求提供来源。 我没有 - 我仅基于我对规范的阅读,我认为这很清楚:
关键字super ...用于调用直接超类的构造函数。 如果超类构造函数调用是限定的,则紧跟".super"的主表达式p是...立即包围的[outer]实例...如果p的类型不是O [outer class]或O的子类,则是编译时错误。
如果在“super”上有一个限定表达式,它只能用于返回超类的封闭类的实例(或封闭类的超类的子类的实例)。 限定表达式与调用super()响应中调用哪个类的构造函数无关,即没有任何值可以限定表达式返回,以更改要调用其构造函数作为super()的类 - super()将始终调用直接超类的构造函数。

只是为了最终结束这个问题:您真的确定没有办法将super()调用重定向为使用this()吗?您有来源吗? - John Assymptoth

0
据我所知,Java中的构造函数不是虚拟的(基类无法调用派生类的任何构造函数)。实际上,您可以在构造函数内部调用方法,并且这些方法将像在最终对象上一样被调用。但是,这可能会引入一些微妙的错误(因为在从基类构造函数调用该方法时,未对派生类成员执行初始化)。
请查看此处以获取更完整的讨论:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接