'super' 在扩展 class 构造函数中的错误用法
Wrong usage of 'super' in extending class constructors
我以为我理解了 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;
}*/
}
为什么第二个构造函数(注释)不起作用?它在做同样的事情..
感谢您的任何澄清:)
编辑:感谢大家 - 抱歉,我无法标记更多答案。如果这不应该是一个编辑,也很抱歉。
快速回顾一下:由于 testSub 是父测试的子项,即使构造函数做同样的事情,子项也需要由其父部分组成。只有当测试有默认构造函数时,这才有可能。
如果我没说对,请回复。
错误清楚地告诉你,你必须调用基class构造函数,否则基class将不会被构造。
做与基础 class 构造函数相同的事情是不够的;你必须真正调用它。
如果基础class有无参构造函数(比如不写就提供默认构造函数),可以不写,编译器会自动调用。
class 的构造函数将总是 调用超级class 构造函数之一。
您可以使用 super
(构造函数的第一条指令)调用 explicit,在这种情况下,您可以选择要调用的构造函数。
如果您没有显式使用super
,它将尝试使用默认(无参数)构造函数。但是你的superclass没有,所以会编译失败。
最简单的解决方案是在您的 superclass 中显式声明无参数构造函数。也就是说,尽可能使用父方法总是更好,因此,如果最终结果相同,使用 super(i)
.
更优雅
你的 class test
有一个明确的构造函数。您必须在每个子 class.
的构造函数中使用此构造函数
如果 test
没有显式构造函数,将生成一个不带参数的隐式构造函数,您不必在子 class 中显式调用它。在这种情况下,您的第二个构造函数将完全有效。
class test {
int i;
}
class testSub extends test{
testSub(int i) {
this.i = i;
}
}
做同样的事情和做同样的事情是不一样的。编译器不会检查您是否处理了 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;
}*/
}
为什么第二个构造函数(注释)不起作用?它在做同样的事情..
感谢您的任何澄清:)
编辑:感谢大家 - 抱歉,我无法标记更多答案。如果这不应该是一个编辑,也很抱歉。
快速回顾一下:由于 testSub 是父测试的子项,即使构造函数做同样的事情,子项也需要由其父部分组成。只有当测试有默认构造函数时,这才有可能。 如果我没说对,请回复。
错误清楚地告诉你,你必须调用基class构造函数,否则基class将不会被构造。
做与基础 class 构造函数相同的事情是不够的;你必须真正调用它。
如果基础class有无参构造函数(比如不写就提供默认构造函数),可以不写,编译器会自动调用。
class 的构造函数将总是 调用超级class 构造函数之一。
您可以使用 super
(构造函数的第一条指令)调用 explicit,在这种情况下,您可以选择要调用的构造函数。
如果您没有显式使用super
,它将尝试使用默认(无参数)构造函数。但是你的superclass没有,所以会编译失败。
最简单的解决方案是在您的 superclass 中显式声明无参数构造函数。也就是说,尽可能使用父方法总是更好,因此,如果最终结果相同,使用 super(i)
.
你的 class test
有一个明确的构造函数。您必须在每个子 class.
如果 test
没有显式构造函数,将生成一个不带参数的隐式构造函数,您不必在子 class 中显式调用它。在这种情况下,您的第二个构造函数将完全有效。
class test {
int i;
}
class testSub extends test{
testSub(int i) {
this.i = i;
}
}
做同样的事情和做同样的事情是不一样的。编译器不会检查您是否处理了 super 应该做的事情。它只会坚持要求您在需要时调用它。