子类继承父类,构造方法会默认先执行父类中无参的构造方法,在此之前声明一点,如果父类中有一个有参的构造方法,是不会给你生成无参构造方法的。
在实例化子类时,执行构造方法,先执行父类的构造方法(如果在第一行没指定,则会默认调用无参构造方法,如果没有无参构造方法,需在第一行用super指定一个父类的构造方法),即在实例化子类之前会先实例化父类。
只要类里有一个构造函数,就不会生成默认的无参构造函数。
举例子说明:
父类
public class Base {
public Base(){
System.out.println("Base 无参数");
}
public Base(int i){
System.out.println("Base 有参数");
}
}
子类:
`public class AA extends Base{
public AA(){
System.out.println(“AA无参数”);
}
public AA(int i){
System.out.println(“AA有参”);
}
}`
测试:
@Test
public void te(){
AA aa=new AA();
AA a2=new AA(3);
}
输出:
Base 无参数
AA无参数
Base 无参数
AA有参
结论:在子类第一行没指定父类构造方法,会默认调用父类无参构造方法,且在实例化子类之前会先实例化父类。
如果父类变成如下
public class Base {
// public Base(){
// System.out.println("Base 无参数");
// }
// public Base(int i){
// System.out.println("Base 有参数");
// }
}
输出:
AA无参数
AA有参
结论:此时父类会有一个自动生成的默认的无参构造函数,内容为空,子类构造函数第一行会先执行该函数,即先实例化父类。
如果只有一个有参的构造函数:
public class Base {
// public Base(){
// System.out.println("Base 无参数");
// }
public Base(int i){
System.out.println("Base 有参数");
}
}
这个时候编译就会报错 。
结论:有一个有参的默认构造函数,则父类不会有无参默认构造函数,而在子类构造函数中的第一行没有指定父类的构造函数,默认调用父类无参构造函数,父类该没有,报错。
修改:在第一行子类第一行指定父类的构造方法。
public class AA extends Base{
public AA(){
super(3);
System.out.println("AA无参数");
}
public AA(int i){
super(4);
System.out.println("AA有参");
}
}
输出:
Base 有参数
AA无参数
Base 有参数
AA有参