Java继承类中speak方法参数传递错误问题求助
解决Java宠物类speak方法参数错误问题
问题分析
你遇到的报错“预期3个参数,但接收到0个”根源有两点:
Cat类中的speak被定义为静态方法,且要求传入3个参数,但调用时你通过实例cat1.speak()调用,既未传递参数,也违背了静态方法的使用规范。- 完全没必要传递参数,
Cat实例本身已通过构造方法或setter保存了name、age、breed属性,直接通过类内的getter方法获取即可。
修正方案
1. 优化父类Pet(可选但推荐)
将Pet定义为抽象类,添加抽象speak方法,强制子类实现专属叫声逻辑,符合面向对象多态特性:
public abstract class Pet { private String name; private int age; public Pet() { name = ""; age = 0; } public Pet(String petName, int petAge) { name = petName; age = petAge; } public String getName() { return name; } public int getAge() { return age; } public void setName(String petName) { name = petName; } public void setAge(int petAge) { age = petAge; } // 抽象方法,子类必须实现 public abstract String speak(); }
2. 修改Cat类的speak方法
去掉static修饰符,删除参数,通过getter获取实例属性并返回字符串:
public class Cat extends Pet { private String breed; public Cat() { super(); breed = ""; } public Cat(String petName, int petAge, String catBreed) { super(petName, petAge); breed = catBreed; } public String getBreed() { return breed; } public void setBreed(String catBreed) { breed = catBreed; } @Override public String toString() { return "Pet breed = " + breed; } // 重写speak方法,直接使用实例自身属性 @Override public String speak() { return "Miaow! I am " + getName() + ", a " + getAge() + " year old " + breed; } }
3. 补充Dog类的正确实现
按照相同逻辑实现Dog类:
public class Dog extends Pet { private String breed; public Dog() { super(); breed = ""; } public Dog(String petName, int petAge, String dogBreed) { super(petName, petAge); breed = dogBreed; } public String getBreed() { return breed; } public void setBreed(String dogBreed) { breed = dogBreed; } @Override public String toString() { return "Pet breed = " + breed; } @Override public String speak() { return "Woof! I am " + getName() + ", a " + getAge() + " year old " + breed; } }
4. 测试类PetTest无需修改
现在cat1.speak()和dog1.speak()可正常调用,运行后输出:
Miaow! I am Pixel, a 4 year old tabby Woof! I am Rex, a 9 year old terrier
内容的提问来源于stack exchange,提问作者Damian Wnukiewicz
相关产品推荐
相关产品推荐

