Java构造函数继承?

ass*_*sss 6 java inheritance constructor

我一直认为构造函数不是继承的,但看看这段代码:

class Parent {
    Parent() {
        System.out.println("S1");
    }
}

class Child extends Parent {
    Child() {
        System.out.println("S2");
    }
}

public class Test5 {
    public static void main(String[] args) {
        Child child = new Child();
    }
}

//RESULT:
//S1
//S2
Run Code Online (Sandbox Code Playgroud)

它表明Child继承了构造函数.为什么结果有S1?有没有可能创建没有参数的2个构造函数,并且在没有基础构造函数的结果中只有Child构造函数(只有S2)?

Vis*_*l K 18

无论你在这里看到什么,都被称为构造函数链接.现在什么是构造函数链接:

构造函数链接通过使用继承来实现.子类构造函数方法的第一个任务是调用其超类的构造函数方法.这确保了子类对象的创建始于继承链中它上面的类的初始化.

继承链中可以有任意数量的类.每个构造函数方法都将调用链,直到达到并初始化顶部的类.然后,当链条回到原始子类时,下面的每个后续类都被初始化.这个过程称为构造函数链接.(来源)

这就是你的程序中发生的事情.编译程序时,您Child的编译方式如下javac:

class Child extends Parent 
{ 
  Child()
  {
    super();//automatically inserted here in .class file of Child
    System.out.println("S2");
  }
}
Run Code Online (Sandbox Code Playgroud)

您的Parent类转换为以下内容:

Parent() 
{
    super();//Constructor of Object class
    System.out.println("S1");
}
Run Code Online (Sandbox Code Playgroud)

这就是您的输出显示为:

S1 //output from constructor of super class Parent
S2 //output from constructor of child Class Child
Run Code Online (Sandbox Code Playgroud)


Div*_*ala 12

Java 文档说:

子类从其超类继承所有成员(字段、方法和嵌套类)。构造函数不是成员,因此子类不会继承它们,但是可以从子类调用超类的构造函数。

如果您没有声明任何类型的构造函数,则会添加一个默认值。

如果在子类的第一行中没有调用任何其他构造函数,则会调用 super()。