为什么我们声明子类的对象时调用超类的构造函数?

新手上路,请多包涵

考虑这段代码:

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

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

为什么会这样?

这个程序的输出是:

在超类的构造函数中

在子类的构造函数中

总和是25

在超类的构造函数中

在子类的构造函数中

总和是29

原文由 aman_novice 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 313
2 个回答

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

参见 此处 的 3.4.4

原文由 Ashkan Aryan 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

 baseClassConstructor(){
    super(someParams);
}

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

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

原文由 Heisenbug 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题