4

根据我对构造函数链接的理解,

每当我们创建子类的对象(或调用子类构造函数)时,
当 我们的子构造函数没有碰巧使用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调用默认或超类的无参数构造函数。

阅读更多:http ://www.java67.com/2012/12/how-constructor-chaining-works-in-java.html#ixzz4qztuMrKW

所以请帮忙!

4

2 回答 2

6

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

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

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

*对于挑剔者,如果您使用反序列化或Unsafe. :)

于 2017-08-27T22:30:37.457 回答
5

是的,默认构造函数只调用this(int),但this(int)隐式调用super()创建一个最终不会调用某种形式的构造函数是不可能的super()

于 2017-08-27T22:30:26.213 回答