'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 应该做的事情。它只会坚持要求您在需要时调用它。