关于父类没有无参构造方法,子类如何处理

1.父类无参构造方法,子类不写,其实会默认调用父类的无参构造方法也就是用super()。 编译运行后,会打印出"子类会调用Father的第一个构造方法"

class Father{
    Father(){
        System.out.println("子类会调用Father的第一个构造方法");
    }
}

class Son extends Father{

    //我没在这写子类的构造方法,但是编译器默认补上子类构造方法,这里相当于有个Son(){super(); }方法,当然这个super()不写也一样
}

class Demo{
    public static void main(String[] args)
    {
               Son s = new Son();
    }
}

2.但是注意了,下面代码无法通过编译。 因为父类重写了构造方法,编译器是不会补上无参构造方法的。子类不重写构造方法,系统会为子类默认补上无参构造方法Son(){super(); } ,注意这个super()调用的是父类的无参构造方法。 这正好和第一句矛盾了,父类没有无参数构造方法子类无法调用到的。怎么解决,看第三条。

class Father{
    //父类的有参数构造方法
    Father(String name){
        System.out.println("子类会调用Father的有参数构造方法");
    }
}

class Son extends Father{
      
}
  
class Demo{
    public static void main(String[] args)
    {
        Son s = new Son();
    }
}

3.在第二条基础上,子类重写构造方法传入的string字串,并且显式的用super(name);调用父类的构造方法,既然你都显式用super(name);了编译器就不会多事给子类补上super(); 这回就编译运行正常了。

class Father{
    Father(String name){
        System.out.println("子类会调用Father的第二个构造方法");
    }
}

class Son extends Father{
    Son(String name){
         super(name);
    }
}

class Demo{
    public static void main(String[] args)
    {
        Son s = new Son("接第二条");
    }
}

4.总之:

 a.涉及构造方法,你不写构造方法,编译器会默认写上无参构造方法,你写编译器就完全不管事了。

b.执行子类的构造方法前一定是执行父类构造方法的(构造方法用来初始化的,没爸爸怎么来儿子),所以子类的构造方法中一定是先执行父类的构造方法用super()。

c.这个super和a说的一样,你不显式写出来,编译器默认用super(),也就是调用父类的无参构造方法,那你父类肯定得有无参构造方法吧。所以我们写上一个父类带参构造方法的时候,另外手动补上个无参构造方法要好些。 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值