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

如何在Zoo父类中调用其他类构造的变量(动物园OOP项目)

解决思路与代码修正

1. 先排查Monkey类的数组问题

你遇到的数组返回null,大概率是数组没初始化、monkeyEnclosure方法没执行,或是数组定义为局部变量而非类成员变量。先修正Monkey类的关键逻辑:

public class Monkey extends Animals {
    // 将数组定义为类成员变量,确保外部能访问到实例
    private Monkey[] monkeyArray;
    private int count = 0; // 记录已添加的猴子数量

    // 构造方法中初始化数组,设置合理容量
    public Monkey() {
        monkeyArray = new Monkey[10];
    }

    public void monkeyEnclosure() {
        Monkey m1 = new Monkey("Baby", "Monkey", "Baboon", "Brown", 8);
        monkeyAddition(m1);
        Monkey m2 = new Monkey("Poppy", "Monkey", "Baboon", "Brown", 6);
        monkeyAddition(m2);
        Monkey m3 = new Monkey("Dad", "Monkey", "Baboon", "Brown", 2);
        monkeyAddition(m3);
        Monkey m4 = new Monkey("Mom", "Monkey", "Baboon", "White", 9);
        monkeyAddition(m4);
        Monkey m5 = new Monkey("Sister", "Monkey", "Baboon", "Black", 7);
        monkeyAddition(m5);
    }

    // 修正添加逻辑,确保实例正确存入数组
    public void monkeyAddition(Monkey monkey) {
        if (count < monkeyArray.length) {
            monkeyArray[count] = monkey;
            count++;
        }
    }

    // 提供获取猴子数组的方法,供Zoo类调用(返回不含空元素的数组)
    public Monkey[] getMonkeyArray() {
        Monkey[] result = new Monkey[count];
        System.arraycopy(monkeyArray, 0, result, 0, count);
        return result;
    }

    // 重写Animals类的展示方法
    @Override
    public void showInfo() {
        System.out.printf("名字:%s,种类:%s,毛色:%s,年龄:%d%n", getName(), getSpecies(), getColor(), getAge());
    }

    // 补全Monkey的成员变量与构造方法、getter
    private String name;
    private String type;
    private String species;
    private String color;
    private int age;

    public Monkey(String name, String type, String species, String color, int age) {
        this.name = name;
        this.type = type;
        this.species = species;
        this.color = color;
        this.age = age;
    }

    public String getName() { return name; }
    public String getSpecies() { return species; }
    public String getColor() { return color; }
    public int getAge() { return age; }
}

2. 在Zoo类中调用并展示猴子实例

Zoo类的main方法里,需先初始化Monkey实例、执行创建猴子的方法,再遍历展示:

public class Zoo {
    public static void main(String[] args) {
        // 创建Monkey实例
        Monkey monkeyEnclosure = new Monkey();
        // 执行monkeyEnclosure方法,生成所有猴子实例
        monkeyEnclosure.monkeyEnclosure();
        // 获取猴子数组
        Monkey[] monkeys = monkeyEnclosure.getMonkeyArray();
        // 遍历调用重写的showInfo方法展示信息
        System.out.println("动物园的猴子们:");
        for (Monkey monkey : monkeys) {
            monkey.showInfo();
        }
    }
}

3. 核心注意事项

  • 成员变量优先级:数组必须定义为Monkey类的成员变量,不能是monkeyEnclosure()方法内的局部变量,否则方法执行后实例会被销毁。
  • 必须执行初始化:一定要调用monkeyEnclosure(),否则数组内没有任何实例,自然返回null。
  • 遵循封装原则:通过getMonkeyArray()方法暴露数组,不要直接访问私有成员。
  • 确保父类方法可重写:Animals类中需定义showInfo()方法(可设为抽象方法或普通方法),保证Monkey类的重写逻辑生效。

内容的提问来源于stack exchange,提问作者dstrix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:30:20