为什么在声明子类的对象时会调用超类的构造函数?(JAVA)

ama*_*ice 34 java constructor object superclass

考虑以下代码:

class Test {
    Test() {
        System.out.println("In constructor of Superclass");
    }

    int adds(int n1, int n2) {
        return(n1+n2);
    }

    void print(int sum) {
        System.out.println("the sums are " + sum);
    }
}


class Test1 extends Test {
    Test1(int n1, int n2) {
        System.out.println("In constructor of Subclass");
        int sum = this.adds(n1,n2);
        this.print(sum);
    }

    public static void main(String[] args) {
        Test1 a=new Test1(13,12);
        Test c=new Test1(15,14);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我们在超类中有一个构造函数,它将由我们为子类构造的每个对象调用(例如a,类Test1调用的对象Test1(int n1, int n2)以及它的父类Test()).

为什么会这样?

该程序的输出是:

在Superclass的构造函数中

在Subclass的构造函数中

总和是25

在Superclass的构造函数中

在Subclass的构造函数中

总和是29

Ash*_*yan 35

因为它将确保在调用构造函数时,它可以依赖于其超类中的所有字段进行初始化.

这里的 3.4.4


Hei*_*bug 20

是.必须在构造派生类之前构造超类,否则可能无法初始化派生类中应该可用的某些字段.

一点注意事项:如果必须显式调用超类构造函数并传递一些参数:

baseClassConstructor(){
    super(someParams);
}
Run Code Online (Sandbox Code Playgroud)

那么超级构造函数必须是第一个调用派生构造函数的方法.例如,这将无法编译:

baseClassConstructor(){
     foo(); 
     super(someParams); // compilation error
}
Run Code Online (Sandbox Code Playgroud)


Jai*_*tel 8

每个类构造函数都会通过编译器自动添加super().

我们都知道默认构造函数是由编译器自动提供的,但它也为第一个语句添加了super().如果你正在创建自己的构造函数,并且你没有this()或super()作为第一个语句,编译器将提供super()作为构造函数的第一个语句.

在此输入图像描述