super()和this()为什么不能同时出现在一个构造中

java语言规定,在执行该类构造前必须先执行父类的构造,直到Object类的构造。
因此任何构造的第一句,必须执行父类的构造,如果没有添加super(),那么编译器会为该构造默认添加一个super()。如果使用super显示的调用父类构造,就用指定的那个父类构造,否则使用默认的无参构造。
但该类构造中出现了this()时,会在该构造中调用本类的其他构造,但最终还是会在调用链的底端调用到父类的构造。所以如果super()和this()同时存在,那么就会出现两次初始化父类。第一次是super()调用父类构造,第二次是this()调用链底端的子类构造里调用父类构造,这样就造成两次调用super。

class Father{
    public Father(){}
}

class Son extends Father{
    public Son(){
        super();//第一次调用super()
        this(1);//编译器报错
    }

    public Son(int a){
        //第二次隐式调用super()
    }
}

但如果父类没有提供无参构造,则需在子类构造中显示调用super()

class Father{

    public Father(int a){

    }
}

class Son extends Father{
    
    public Son(){} //编译报错,需加入super(1)
}
  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值