如何在Java作业的Driver类中用数组存储子类对象并遍历?
如何在Java作业中使用数组存储子类对象并循环调用方法?
嘿,我来帮你搞定这个数组的需求!首先你目前的Test类是逐个创建子类对象并输出信息,但作业要求用数组存储所有子类对象,再通过循环统一处理,其实改起来很简单,我给你一步步说明:
第一步:调整现有代码的小问题(可选但更规范)
你父类Dog里的name、age、coatColor用了static修饰,这其实不太合理——static是类级别的变量,所有狗对象会共享同一个值,但每只狗的名字、年龄、毛色都是独有的,所以应该改成实例变量。同时可以把抽象方法的名字改得更语义化,比如从name()改成printName(),避免和变量名混淆:
package objectsofaffection; public abstract class Dog { // 改为实例变量,每个狗对象拥有自己的属性 String name; String age; String coatColor; public abstract void printName(); public abstract void printAge(); public abstract void printCoatColor(); }
然后子类的构造函数可以用来给这些实例变量赋值,而不是直接在构造函数里调用打印方法(把打印逻辑留到循环里统一处理),比如DogBetty:
package objectsofaffection; public class DogBetty extends Dog { public DogBetty() { // 在构造函数中给当前狗的属性赋值 this.name = "Betty"; this.age = "11 years"; this.coatColor = "Brown"; } @Override public void printName() { System.out.println("Dog Name: " + this.name); } @Override public void printAge() { System.out.println("Age: " + this.age); } @Override public void printCoatColor() { System.out.println("Coat Color: " + this.coatColor); } }
其他子类(DogCarl、DogJoe、DogMollie)都按照这个逻辑修改,把属性赋值放在构造函数,打印逻辑留在重写的方法里。
第二步:修改Driver类(Test)使用数组和循环
核心思路是利用Java的多态特性:父类类型的数组可以存储所有子类对象。然后通过增强for循环遍历数组,逐个调用对象的方法即可:
package objectsofaffection; public class Test { public static void main(String[] args) { // 创建Dog类型的数组,存入所有子类对象 Dog[] dogs = new Dog[]{ new DogBetty(), new DogJoe(), new DogCarl(), new DogMollie() }; // 循环遍历数组,调用每个狗对象的打印方法 for (Dog dog : dogs) { dog.printName(); dog.printAge(); dog.printCoatColor(); System.out.println(); // 每只狗的信息之间加空行分隔 } } }
为什么这样做符合要求?
- 用
Dog[]数组统一存储了所有子类对象,满足作业中“使用数组存储所有子类对象”的要求; - 通过循环遍历数组,批量调用每个对象的方法,避免了重复的代码,也符合“通过循环打印每个对象的相关值或调用其方法”的要求;
- 利用多态特性,父类引用可以指向子类对象,代码更简洁易维护。
内容的提问来源于stack exchange,提问作者Anthony Stem
相关产品推荐
相关产品推荐

