当父类没有默认的构造方法的时候,子类的构造方法就会出错!
不管在什么时候,只要是继承的关系,构造函数的第一行都必须是对父类构造方法的调用。也就是说,每次你创建一个子类的实例之前,都会在内存中创建一个父类的新实例。即是会默认调用super()。
在这里我想问大家一个问题:就是子类在哪里调用了父类的构造方法?
答案应该是:在子类构造方法的第一行中默认(不显示)调用super(),即调用了父类构造方法
java编译器会提供一个默认的无参构造方法。如果类没有提供任何构造方法,编译器则会自动生成。注意:默认的无参构造方法和你可以自己添加到类中的无参数构造方法之间没有任何区别。
如果一个父类有一个无参数的构造函数(不管它是手动声明的还是由编译器提供的),编译器将能够代表你添加super()一行。如下:
public class Demo6 {
Demo6(int n , int t){}
Demo6(){}//无参的构造方法
}
class Test extends Demo6{
Test(){}
}
如果父类中只有参数化的构造函数,你必须在子类的构造函数中手动添加调用super(name, salary)作为第一行,否则代码将无法编译。如下:
public class Demo6 {
Demo6(int n , int t){}
}
class Test extends Demo6{
Test(int n , int t){
super(n , t);//必须写在第一行
}
}
这里类似于单类中有参构造方法和无参构造方法的区别联系。可参考我另一篇文章
(java构造方法的一些注意事项(构造器))。