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()。