如何在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
相关产品推荐
相关产品推荐

