1 回答
TA贡献1841条经验 获得超3个赞
如果它没有没有参数的构造函数(默认一个),则需要指定用于创建超类的构造函数*
构造函数中的第一个语句是调用,super()
除非您使用任何参数显式调用 this 或 super。该super()
调用由 java 在编译时注入。因此它在 Y 类中寻找非参数构造函数。
请参考文档:
注意:如果构造函数没有显式调用超类构造函数,Java 编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。Object 确实有这样的构造函数,所以如果 Object 是唯一的超类,则没有问题。
在实践中,编译器会预处理您的代码并生成如下内容:
class X{
X(){
super(); // Injected by compiler
System.out.println("Inside X()");
}
X(int x){
super(); // Injected by compiler
System.out.println("Inside X(int)");
}
}
class Y extends X{
Y(String s){
super(); // Injected by compiler
System.out.println("Inside Y(String)");
}
Y(int y){
super(1000);
System.out.println("Inside Y(int)");
}
}
class Z extends Y{
Z(){
super(); // Injected by compiler
System.out.println("Inside Z()");
}
Z(int z){
super(100);
System.out.println("Inside Z(int)");
}
}
public class Program{
public static void main(String args[]){
Z z=new Z(10);
}
}
然后它将继续编译它,但是如您所见,Z 非参数构造函数尝试引用 Y 非参数构造函数,它不存在。
*正如 Carlos Heuberger 所澄清的那样。
添加回答
举报