关于Java中构造函数链接的困惑

时间:2017-08-27 22:25:14

标签: java constructor constructor-chaining

据我所知,Constructor Chaining就是那个

  

每当我们创建子类的对象(或调用子类构造函数)时a    父类的默认构造函数的调用首先自动生成    我们的子构造函数不会使用 this (对于同一个类)或 super 关键字调用另一个构造函数。来源:http://www.java67.com/2012/12/how-constructor-chaining-works-in-java.html

所以,如果我的理解是正确的

然后是以下代码: -

Class First{
    First(){
    System.out.print("Hello");
    }

Class Second extends First{

    Second(int i)
    {
    System.out.println("Blogger");
    }
    Second(){
    this(2);    //default constructor is calling another constructor using this keyword
    }


public static void main(String[] args)
{
    Second ob = new Second();
}

输出应仅为Blogger

但输出为HelloBlogger

所以看起来父类的默认构造函数仍然被调用。 但引用该来源: -

  

2)如果你没有从父类或同一个类调用另一个构造函数,而不是Java调用default或没有超类的参数构造函数。

了解详情:http://www.java67.com/2012/12/how-constructor-chaining-works-in-java.html#ixzz4qztuMrKW

所以请帮忙!

2 个答案:

答案 0 :(得分:5)

是的,默认构造函数只调用this(int),但this(int)隐式调用super()。不能使最终调用某种形式的super()的构造函数成为可能。

答案 1 :(得分:5)

基本规则是,超类构造函数的这种或那种方式始终被调用。这条规则没有技巧*并且有充分理由:子类依赖于超类的状态,因此如果超类未初始化,则子类行为不正确。 (例如,可以考虑继承的protected字段。)

如果你向super(...)添加一个显式调用(你可以选择在这里调用哪个超级构造函数),那么将调用它,否则将从任何地方隐式调用super()(没有参数)不使用this(...)调用另一个的构造函数。

在您的情况下,链条如下:Second() -> Second(int) -> First()。第一个调用是显式的(this(2)),第二个调用是隐式的。

*对于nitpickers,如果您使用反序列化或Unsafe,则此声明显然不正确。 :)