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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:48:14