Java如何在main方法中访问子类方法统计农场动物数量
Farm类统计各动物数量的实现方案
你现有代码存在3个会直接导致编译/运行错误的问题:
HowMany方法内重复声明newString变量,且未初始化就直接使用+=拼接,不符合Java语法规则Pig类中错误地将全局猪总数字段放在单个Pig实例下维护,会出现数据不一致问题- 未做类型校验就试图从Animal父类数组中获取子类实例,会触发类型转换异常
具体实现步骤
1. 修正动物子类结构
所有动物子类(Pig、Cow等)只维护单个个体的属性和方法,不要存放全局类别的计数变量,基础写法参考:
// Animal作为基类 public class Animal { // 通用动物属性、方法放这里 } // Pig子类继承Animal public class Pig extends Animal { // 仅写猪独有的属性、方法,不要存全局猪数量 } // Cow子类继承Animal public class Cow extends Animal { // 仅写牛独有的属性、方法 }
2. 在Farm类中实现计数逻辑
Farm类持有存储所有动物的集合,遍历集合时通过instanceof判断元素的实际子类类型,分别统计数量即可,修正后的完整代码参考:
import java.util.List; import java.util.ArrayList; import java.util.Arrays; // 所有类默认继承Object,不需要显式写extends Object public class Farm implements Comparable<Farm> { // 农场持有的动物集合 private List<Animal> animalList; // 构造方法初始化动物集合 public Farm(List<Animal> animalList) { this.animalList = animalList; } public String howMany() { StringBuilder countResult = new StringBuilder(); // 遍历统计对应动物数量 int pigCount = 0; int cowCount = 0; for (Animal animal : animalList) { if (animal instanceof Pig) { pigCount++; } else if (animal instanceof Cow) { cowCount++; } // 其他动物类型按相同逻辑加判断即可 } countResult.append("There are ").append(pigCount).append(" pigs on the farm\n"); countResult.append(" There are ").append(cowCount).append(" cows on the farm"); return countResult.toString(); } @Override public int compareTo(Farm otherFarm) { // 按你的业务规则实现比较逻辑即可,示例为按动物总数量比较 return Integer.compare(this.animalList.size(), otherFarm.animalList.size()); } public static void main(String[] args) { // 测试用例 List<Animal> testAnimals = new ArrayList<>(Arrays.asList( new Pig(), new Pig(), new Cow(), new Pig(), new Cow() )); Farm myFarm = new Farm(testAnimals); // 直接调用方法获取统计结果 String statInfo = myFarm.howMany(); System.out.println(statInfo); } }
如果你使用Java 16及以上版本,
instanceof支持模式匹配,判断类型后可以直接得到转换后的子类实例,不需要额外强转:if (animal instanceof Pig pig) { // 这里可以直接调用Pig类的独有方法,比如pig.getWeight()之类 pigCount++; }
注意事项
- 不要跳过类型判断直接将Animal对象强转为Pig/Cow等子类,一旦集合中存在其他类型的实例,会直接抛出
ClassCastException运行时错误。 - 拼接长字符串优先使用
StringBuilder,比直接用String拼接效率更高,也不会出现重复声明变量、未初始化就赋值的语法错误。 - 全局类别的统计逻辑统一放在Farm类中处理,不要分散在单个动物实例中,避免出现计数不同步的问题。
内容的提问来源于stack exchange,提问作者I Love Mangoes
相关产品推荐
相关产品推荐

