Java使用extends继承时报required: no arguments等编译错误如何解决
报错原理与规则说明
根因:Java继承的强制实例化规则
子类实例化时必须优先完成父类部分的初始化,默认会隐式调用父类的无参构造函数。如果父类自定义了带参数的构造函数,Java不会再为父类生成默认的无参构造函数,此时子类必须显式调用父类存在的有参构造,否则编译不通过。
三个报错的对应问题:
第二个报错(父类构造调用不匹配)
你的父类PClass仅定义了接收String参数的构造函数,没有无参构造。而子类Scout没有自定义任何构造函数,Java会自动为其生成无参默认构造,该构造会隐式调用super()(父类无参构造),和父类实际存在的构造函数参数要求不符,因此触发报错。第一个报错(Scout构造参数不匹配)
你在代码中调用new Scout("Olaf"),但Scout类本身没有定义接收String参数的构造函数,仅存在自动生成的无参构造,传入参数和构造函数要求不匹配,触发报错。第三个报错(私有属性访问权限不足)
private修饰的属性仅允许在定义它的类内部访问,子类Scout不属于PClass内部范畴,直接访问父类的private String name会触发权限报错。将name修饰符改为protected后,同包下的子类可直接访问该属性,因此解决该报错。
super()的作用
super关键字指代父类实例,super(参数)的作用是显式调用父类的对应参数构造函数。你修复时给Scout新增了带String参数的构造函数,内部调用super(nn),就是将子类接收的参数传递给父类构造完成父类初始化,完全符合继承的实例化规则,因此解决了前两个编译报错。
修复后的Scout类示例:
public class Scout extends PClass{ // 自定义带String参数的构造函数 public Scout(String nn) { // 显式调用父类有参构造,完成父类初始化 super(nn); } public void scoot(){ System.out.print("\n\n "+name+" is out off the box."); } }
内容的提问来源于stack exchange,提问作者TheBoringEdward
相关产品推荐
相关产品推荐

