为什么当我们声明子类的对象时,会调用超类的构造函数?(爪哇)

2022-09-01 02:54:02

请考虑以下代码:

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);
    }
}

如果我们在超类中有一个构造函数,它将被我们为子类构造的每个对象调用(例如,用于类调用的Object及其父级)。aTest1Test1(int n1, int n2)Test()

为什么会发生这种情况?

该程序的输出是:

在超类的构造函数中

在子类的构造函数中

总和为 25

在超类的构造函数中

在子类的构造函数中

总和为 29


答案 1

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

在这里看到3.4.4


答案 2

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

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

baseClassConstructor(){
    super(someParams);
}

则超级构造函数必须是对派生构造函数的第一个方法调用。例如,这不会编译:

baseClassConstructor(){
     foo(); 
     super(someParams); // compilation error
}