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

Confusion Regarding Constructor Chaining in Java

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

Whenever we create an object of child class (or call child class constructor) a call to default constructor of parent class is automatically made first ONLY IF
our child constructor does not happen to call another constructor either using this (for same class) or super keyword. source: 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

所以看起来父 class 的默认构造函数确实仍在被调用。 但是从那个来源引用:-

2) If you do not call another constructor either from parent class or same class than Java calls default or no argument constructor of super class.

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

所以请帮忙!

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

的构造函数

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

如果添加对 super(...) 的显式调用(您可以在此处选择调用哪个超级构造函数),那么将调用它,否则将调用 super()(不带参数)从任何不使用 this(...).

调用另一个的构造函数

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

*对于吹毛求疵的人来说,如果你使用反序列化或者Unsafe,这个说法显然是不正确的。 :)