我以为我理解了超级的所作所为,但我无法理解为什么在以下代码中
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;
}*/
}
为什么第二个构造函数(已修改)不起作用?它正在做同样的事情..
感谢您的任何澄清:)
编辑:感谢所有人 - 抱歉,我无法标记更多答案。如果这不应该是编辑,也很抱歉。快速回顾:由于testSub是父测试的子节点,即使构造函数执行相同的操作,子节点也需要包含其父节点。只有当test具有默认构造函数时,才有可能。 如果我没有做对,请回复。
答案 0 :(得分:1)
由于错误明确告诉您,必须调用基类构造函数,否则将不构造基类。
做与基类构造函数相同的事情是不够的;你必须实际上叫它。
如果基类具有无参数构造函数(例如,如果不编写任何构造函数,则提供默认构造函数),您可以将其保留,编译器将自动调用它。
答案 1 :(得分:1)
您的班级test
有一个明确的构造函数。您必须在每个子类的构造函数中使用此构造函数。
如果test
没有显式构造函数,则会生成一个没有参数的隐式构造函数,并且您不必在子类中显式调用它。在这种情况下,你的第二个构造函数将是完全有效的。
class test {
int i;
}
class testSub extends test{
testSub(int i) {
this.i = i;
}
}
答案 2 :(得分:0)
做同样的事情与做同样的事情是不一样的。编译器不会检查你是否负责super应该做什么。它只会坚持你在需要时调用它。
答案 3 :(得分:-1)
您的类的构造函数将始终调用其中一个超类构造函数。
您可以使用super
(构造函数的第一条指令)进行显式调用,在这种情况下,您可以选择要调用的构造函数。
如果您没有明确使用super
,它将尝试使用默认(无参数)构造函数。但是你的超类没有它,所以它将无法编译。
最简单的解决方案是在超类中显式声明无参数构造函数。也就是说,在可能的情况下使用父方法总是更好,因此,如果最终结果相同,则使用super(i)
会更加优雅。