【问题标题】:why their should override super class parameterize constructor in sub class constructor when it extends from super class?为什么当它从超类扩展时,他们应该在子类构造函数中覆盖超类参数化构造函数?
【发布时间】:2018-08-19 15:36:59
【问题描述】:
为什么在创建子类构造器的时候需要在子类构造器中编译代码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);
}
}
【问题讨论】:
标签:
java
subclass
superclass
【解决方案1】:
先构造超类,再构造子类。
由于超类没有默认构造函数,所以必须先调用super(0);。
您可以在超类中添加默认构造函数:
public Super(){}
那么你不需要在子类中调用super(0);。
【解决方案2】:
当子类扩展超类时,超类中的所有成员(只有方法和变量,构造函数不是成员)都扩展到子类。
从 Demo 类中的 main 方法调用 Sub 类 Sub(int) 构造函数,
然后Sub(int)构造函数中的第一条语句在Super类中有super()调用,自动放入java编译器。
但上面的代码没有默认构造函数(因为你写了任何构造函数java编译器不会自动给出默认构造函数。你不需要参数构造函数(默认构造函数)你必须编写它是手动的)所以你需要手动编写 super(int) 调用。因为你在 Super 类中编写了这个构造函数。
如果不是就是编译错误。
然后输出如下:
super(int i)
Sub(int)
您必须 Demo 类是公共的(除了超级类),而不是一个包中的所有类。因为它有 main 方法。
【解决方案3】:
这是因为在 java 中每个子类都需要调用其父类的构造函数。如果你在超类中有一个默认构造函数,那么你不需要像 java 那样显式调用它,但是如果你在超类中没有任何默认构造函数,没有参数,而是你有一些构造函数您需要在子类构造函数的第一行中调用参数。