继承抽象父类Animal时遇构造器参数不匹配错误,求原因及解决
问题解答
一、构造器编译错误的原因
当子类Cat的构造器中没有显式调用父类Animal的构造器时,Java编译器会自动在子类构造器的第一行插入super();(调用父类无参构造器)。但你的抽象类Animal只定义了带两个参数的构造器Animal(String, int),没有显式声明无参构造器——Java编译器只有在类没有定义任何构造器时,才会自动生成默认的无参构造器。此时编译器找不到父类的无参构造器,就会抛出你看到的错误。
解决方法:
在Cat的构造器第一行显式调用父类的带参构造器,传入父类需要的参数,示例代码如下:
public Cat(String nm, int legs, String sd, String col) { super(nm, legs); // 调用父类Animal的带参构造器 // 此处处理Cat自身属性sd、col的初始化逻辑 }
二、抽象父类是否应该放在单独文件中?
必须单独存放,这是Java的基础编码规范:每个顶级类(包括抽象类、普通类、接口)都应该放在与类名完全同名的单独.java文件中(内部类除外)。
你之前单独存放时出现的display()相关错误,大概率是以下几种情况:
- 未实现抽象方法:
Animal中的display()是抽象方法,子类Cat如果不是抽象类,必须完整实现该方法(方法名、参数列表、返回值需和父类完全一致,Java对大小写敏感) - 访问权限问题:如果
Animal的display()方法是包私有(无修饰符),而Cat放在不同包下,就无法访问该方法。建议将抽象方法声明为public或protected - 包导入错误:若
Animal和Cat不在同一个包,需要在Cat类顶部导入Animal类,格式如import your.package.name.Animal; - 拼写错误:比如把
display()写成Display()或disply(),导致编译器判定你未实现父类的抽象方法
内容的提问来源于stack exchange,提问作者jaytee
相关产品推荐
相关产品推荐

