在下面的代码中,我理解子类中的super(t)是在其超类(类B)中显式调用no-args构造函数。我似乎遇到了解问题的原因是为什么子类必须在超类中调用no-args构造函数?我似乎无法解决这个问题的目的吗?
public class Test {
public static void main(String[] args) {
B b = new B(5);
}
}
class A extends B {
public A(int t) {
super(t);
System.out.println("A's constructor is invoked");
}
}
class B {
public B(int k) {
System.out.println("B's constructor is invoked");
}
}
答案 0 :(得分:3)
Super必须在像parent must exists before child
之类的子实例之前实例化。
我理解子类中的super(t)在其>超类(B类)中显式调用no-args构造函数
super(t)
实际上super(5)
会调用public B(int k)
super()
尝试调用不存在的public B()
。
注意:如果类中没有可用的构造函数,编译器提供no-arg构造函数。
答案 1 :(得分:1)
子类中的super(t)在其超类(类B)中显式调用no-args构造函数。
不,super(t)
可以改写为B(t)
。它正在调用您在代码中显示的构造函数。
我相信你在想的是
如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。
来自http://docs.oracle.com/javase/tutorial/java/IandI/super.html
即如果代码没有super(t)
,则会调用默认的no-args构造函数,但是
如果超类没有无参数构造函数,则会出现编译时错误
答案 2 :(得分:1)
你的班级B
没有no-args构造函数(那个没有参数的构造函数)。如果它有一个,它将由A
的构造函数自动调用。但是在示例中,您必须使用super(t)
手动调用它,以指定应该使用的参数。