You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:20:33