从超类扩展时,为什么他们应该在子类构造函数中覆盖超类参数化构造函数?

时间:2018-08-19 15:36:59

标签: java subclass superclass

为什么在创建子类构造函数时需要在子类构造函数中使用代码super(0)进行编译?

public class Super {
    public Super(int i) {
        System.out.println("super(int i)");
    }
}

class Sub extends Super{
    public Sub(int i) {
        super(0); // why this code needed here to compile?
        System.out.println("Sub(int)");
    }
}

class Demo{
    public static void main(String[] args) {
        Sub s1=new Sub(100);
    }
}

3 个答案:

答案 0 :(得分:1)

应在构造子类之前构造超级类。

由于超类没有默认的构造函数,因此必须首先调用super(0);

您可以在超类中添加默认构造函数:

public Super(){}

那么您就不需要在子类中调用super(0);

答案 1 :(得分:0)

当Sub类扩展为Super类时,super类中的所有成员(仅方法和变量,构造函数不是成员)都扩展为Sub类。

从Demo类的主方法(称为Sub类Sub(int)构造函数)开始, 然后Sub(int)构造函数中的第一条语句在Super类中具有super()调用。它将自动放入Java编译器。

但是上面的代码没有默认构造函数(因为您编写了任何构造函数,java编译器都不会自动给出默认构造函数。不需要参数构造函数(默认构造函数)就必须编写) ),因此您需要编写手动调用的super(int)。因为您是在Super类中编写此构造函数的。 如果不是,则为编译错误。

然后输出如下:

super(int i)
Sub(int)

除了一个包中的所有类之外,您还必须演示的类是公共的(超级类除外)。因为它有主要方法。

答案 2 :(得分:0)

这是因为在Java中,每个子类都需要调用其超类的构造方法。如果您在超类中有一个默认构造函数,则不需要像Java那样显式调用它,但是如果您在超类中没有任何不带参数的默认构造函数,而是有一些带有您需要在子类构造函数的第一行中调用该参数。