[英]why their should override super class parameterize constructor in sub class constructor when it extends from super class?
为什么在创建子类构造函数时需要在子类构造函数中使用代码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);
}
}
在构造子类之前,应构造超类。
由于超类没有默认的构造函数,因此您必须调用super(0);
第一。
您可以在超类中添加默认构造函数:
public Super(){}
那么您不需要调用super(0);
在子类中。
当Sub类扩展Super类时,super类中的所有成员( 仅方法和变量,构造函数不是member )都扩展为Sub类。
从Demo类的主方法中调用Sub类的Sub(int)构造函数,然后Sub(int)构造函数中的第一条语句在Super类中进行super()调用,它将自动放入Java编译器。
但是上面的代码没有默认构造函数 ( 因为您编写的构造函数java编译器不会自动提供默认构造函数。您不需要参数构造函数(默认构造函数)就必须手动编写它 )所以您需要编写称为super(int)的代码手动。 因为您是在Super类中编写此构造函数的。 如果不是,则为编译错误。
然后输出如下:
super(int i)
Sub(int)
而不是将所有类放在一个包中,您必须将Demo类设为public(Super类除外)。 因为它有主要方法。
这是因为在Java中,每个子类都需要调用其父类的构造方法。 如果您在超类中有一个默认构造函数,则不需要像Java那样显式调用它,但是如果您在超类中没有任何不带参数的默认构造函数,而是有一些带有您需要在子类构造函数的第一行中调用该参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.