父子类继承时构造函数说明

1 手动创建构造器

一般来说一个类至少要有一个显式的无参构造函数。

但是有的题目会设置一个父类只有有参构造函数,而且由于显式声明了构造函数,隐式的无参构造函数就没了。

public class Father {
    private int a;
    public Father(int b){
        this.a=b;
    }
}

此时子类的所有构造函数必须都要有一个super(b)字段,以满足父类的构造函数

public class Son extends Father{
    private int c;
    public Son(int b) {
        super(b);
    }
}

否则就会报错,如图,子类继承父类之后,写的无参构造和有参构造,如果不包含super(b)字段,就会报错。

一句话,如果老子有需求(父类全是有参构造),儿子必须回应(子类的构造函数全要带上super(b)

image

但是父类有无参构造函数后,比如下面显式声明一个无参构造,又或者一个构造函数都不写,直接用隐式无参构造

public class Father {
    private int a;
    public Father(int b){
        this.a=b;
    }
    
    public Father(){
        
    }
}

子类就无所谓了,不带super(b)字段就表示调用的是父类的无参构造,如图,报错全消失了

image

总结

如果父类只有带参数的构造函数,那么手动创建的构造器必须要使用super()字段给父类构造函数传参,如果父类有无参构造,那么子类不使用super()时,默认调用父类的无参构造

2 Lombok

如果项目使用了Lombok,那么如果父类只有有参构造函数,子类使用@NoArgsConstructor@AllArgsConstructor会报错,因为这两个注解等同于生成子类的无参构造和全参构造,而这两种构造器均不带super(b)字段

父类

public class Father {
    private int a;
    public Father(int a){
        this.a=a;
    }
}

子类使用Lombok会报错

image

此时子类即便写了一个带super(b)字段的构造器,还是会报错,因为这两个注解给到的构造函数还是不包含父类

image

这两个注解就等价于下面这种情况(由于子类没有成员变量,全参构造注解等同于无参)

image

总结

@NoArgsConstructor@AllArgsConstructor只会针对当前所在类的成员变量创建构造函数,并不会去管父类的构造函数

posted @ 2021-11-16 17:39  夏·舍  阅读(1108)  评论(0编辑  收藏  举报