Java 错误使用';超级';在扩展类构造函数中

Java 错误使用';超级';在扩展类构造函数中,java,polymorphism,super,Java,Polymorphism,Super,我想我理解super的功能,但是我不明白下面代码中的原因 class test { int i; test(int i){ this.i = i; } } class testSub extends test{ testSub(int i) { super(i); } /*testSub(int i) { this.i = i; }*/ } 为什么第二个构造函数(commmented)不能

我想我理解super的功能,但是我不明白下面代码中的原因

class test {
    int i;

    test(int i){
    this.i = i;
}

}    
class testSub extends test{ 

    testSub(int i) {
        super(i);
    }

    /*testSub(int i) {
        this.i = i;
    }*/
}
为什么第二个构造函数(commmented)不能工作?它也在做同样的事情

感谢您的澄清:)

编辑:谢谢大家-对不起,我不能标记更多的答案。如果这不是编辑,也很抱歉

简要回顾一下:由于testSub是父测试的子测试,即使构造函数执行相同的操作,子测试也需要由父部分组成。只有当测试具有默认构造函数时,这才是可能的。
如果我没有理解正确,请回答。

错误清楚地告诉您,您必须调用基类构造函数,否则将无法构造基类

仅仅做与基类构造函数相同的事情是不够的;你真的应该叫它


如果基类有一个无参数构造函数(例如,如果不编写任何构造函数,则提供默认构造函数),则可以省略它,编译器将自动调用它。

类的构造函数将始终调用一个超类构造函数

您可以使用
super
(构造函数的第一条指令)显式调用,在这种情况下,您可以选择要调用的构造函数

如果不显式使用
super
,它将尝试使用默认(无参数)构造函数。但是您的超类没有它,因此它将无法编译


最简单的解决方案是在超类中显式声明无参数构造函数。也就是说,在可能的情况下最好使用父方法,因此,如果最终结果相同,则使用
super(i)

会更加优雅。您的类
test
有一个显式构造函数。必须在每个子类的构造函数中使用此构造函数

如果
test
没有显式构造函数,那么将生成一个没有参数的隐式构造函数,并且您不必在子类中显式调用它。在这种情况下,您的第二个构造函数将是完全有效的

class test {
    int i;
}

class testSub extends test{ 

    testSub(int i) {
        this.i = i;
    }
}

做同样的事情和做同样的事情是不一样的。编译器不会检查你是否注意到super应该做什么。它只是要求您在需要时调用它。

您可能需要提到,Java中的每个类都有一个没有参数的默认构造函数,只要您不提供任何构造函数。这就是代码失败的实际原因:
test
没有提供无参数构造函数。当你说我必须调用父类的构造函数时,这就是Java的设计方式,还是我缺少一些功能方面的东西?因为在我调用super(I)之后,我仍然可以更改实例变量。。或者子类只是它的父类+加法-因此超级构造函数是必要的?很抱歉,这是不可理解的。@raven22122122122121:后者。