java继承:构造方法

子类继承父类,构造方法会默认先执行父类中无参的构造方法,在此之前声明一点,如果父类中有一个有参的构造方法,是不会给你生成无参构造方法的。

在实例化子类时,执行构造方法,先执行父类的构造方法(如果在第一行没指定,则会默认调用无参构造方法,如果没有无参构造方法,需在第一行用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有参

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值