Java继承场景子类构造器报参数列表长度不匹配编译错误
报错原因
Java继承机制有明确规则:所有子类的构造方法,必须在执行自身逻辑前先调用父类的构造方法。如果开发者没有在子类构造器第一行显式写父类构造调用代码,编译器会自动插入一行无参的super()调用,也就是默认找父类的无参构造方法执行。
你的代码里父类Adder只定义了一个接收int类型参数的构造器,一旦类里自定义了有参构造,Java就不会再自动生成默认的无参构造器。这时候子类构造器自动插入的无参super()找不到匹配的父类构造,就会抛出你看到的「参数列表长度不匹配」错误。
你给子类构造器加多少个参数都解决不了问题——只要没显式写对父类构造的调用,编译器还是会默认插入无参super(),报错逻辑完全不变。
修复方案
二选一即可:
- 方案1(推荐):在子类构造器第一行显式调用父类的带参构造,传入匹配类型的参数
修正后的子类代码:
运行后正常输出:class ad extends Adder{ int b; ad(int b){ super(b); // 必须写在构造器第一行,显式调用父类Adder的int参数构造器 this.b=b; System.out.println(b+"Derivative"); } }5Base 5Derivative - 方案2:给父类手动补充无参构造器,让默认插入的无参
super()能匹配到
父类补充代码示例:
注意如果选这个方案,子类不主动调用父类带参构造的话,父类带参构造里的赋值、打印逻辑都不会执行。class Adder{ int a; // 手动添加无参构造 Adder(){} Adder(int a){ this.a=a; System.out.println(a+"Base"); } }
内容的提问来源于stack exchange,提问作者Gunotham Solanki
相关产品推荐
相关产品推荐

