Java 构造函数继承?

2022-09-04 05:26:39

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

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

它显示了子继承的构造函数。为什么结果上有S1?有没有可能在没有参数的情况下创建2个构造函数,并且在没有基构造函数的结果上只有子构造函数(只有S2)?


答案 1

您在这里看到的任何内容都称为构造函数链接。现在什么是构造函数链接:

构造函数链接通过使用继承发生。子类构造函数方法的第一个任务是调用其超类的构造函数方法。这可确保子类对象的创建从继承链中其上方的类的初始化开始。

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

这就是您的程序中发生的事情。当你编译你的程序时,你的编译方式是这样的:Childjavac

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

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

Parent() 
{
    super();//Constructor of Object class
    System.out.println("S1");
}

这就是您的输出显示为以下原因的原因:

S1 //output from constructor of super class Parent
S2 //output from constructor of child Class Child

答案 2

Java文档说:

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

如果未声明任何类型的构造函数,则会添加默认值。

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


推荐