为什么在创建子类构造函数时需要在子类构造函数中使用代码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);
}
}
答案 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那样显式调用它,但是如果您在超类中没有任何不带参数的默认构造函数,而是有一些带有您需要在子类构造函数的第一行中调用该参数。