在扩展类构造函数中错误地使用'super'

时间:2015-04-12 20:22:39

标签: java polymorphism 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是父测试的子节点,即使构造函数执行相同的操作,子节点也需要包含其父节点。只有当test具有默认构造函数时,才有可能。 如果我没有做对,请回复。

4 个答案:

答案 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)会更加优雅。