Java 错误使用';超级';在扩展类构造函数中
我想我理解super的功能,但是我不明白下面代码中的原因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)不能
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:后者。