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

Java测试类疑问:如何在AnimalTest中创建Animal子类实例

解决动态创建Animal子类并调用sound()的问题

先修正你现有代码里的几个基础问题,符合Java编码规范:

  1. 类名必须用大驼峰命名:把cow、pig、sheep、duck改成Cow、Pig、Sheep、Duck,避免潜在的编译或逻辑问题
  2. 父类Animal里的animal()方法和main方法可以删除,作业要求的是带默认sound()的父类,测试逻辑统一放在AnimalTest中
  3. 子类重写sound()时加上@Override注解,明确标记是重写父类方法,既规范又能让编译器帮你检查重写是否正确
  4. 子类字符串中的双引号需要转义,比如"moo"要写成\"moo\",否则会触发编译错误

修正后的父类代码

public class Animal {
    public void sound() {
        System.out.println("An animal makes a sound based on the animal that it is.");
    }
}

修正后的子类示例(Cow,其余子类按此格式修改)

public class Cow extends Animal {
    public Cow() {
        System.out.println("I am a cow");
    }

    @Override
    public void sound() {
        System.out.println("cow says \"moo\"");
    }
}

接下来解决核心问题:在AnimalTest中根据输入创建对应子类并调用sound(),提供两种实现方式:

方式一:switch-case语句(新手友好,逻辑直观)

直接根据输入字符串匹配对应的子类,创建实例后调用方法:

import java.util.Scanner;

public class AnimalTest {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("输入动物名称:pig/sheep/duck/cow");
        String input = scan.nextLine().trim().toLowerCase(); // 转小写+去空格,提升输入容错性

        Animal animal = null;
        switch (input) {
            case "pig":
                animal = new Pig();
                break;
            case "sheep":
                animal = new Sheep();
                break;
            case "duck":
                animal = new Duck();
                break;
            case "cow":
                animal = new Cow();
                break;
            default:
                System.out.println("输入的动物不存在!");
                animal = new Animal();
        }

        if (animal != null) {
            animal.sound();
        }
        scan.close();
    }
}

方式二:Map映射(扩展性更强)

如果后续需要新增动物子类,无需修改核心逻辑,只需往Map中添加新的映射关系即可:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.function.Supplier;

public class AnimalTest {
    private static final Map<String, Supplier<Animal>> ANIMAL_MAP = new HashMap<>();

    static {
        ANIMAL_MAP.put("pig", Pig::new);
        ANIMAL_MAP.put("sheep", Sheep::new);
        ANIMAL_MAP.put("duck", Duck::new);
        ANIMAL_MAP.put("cow", Cow::new);
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("输入动物名称:pig/sheep/duck/cow");
        String input = scan.nextLine().trim().toLowerCase();

        Supplier<Animal> animalSupplier = ANIMAL_MAP.get(input);
        if (animalSupplier != null) {
            Animal animal = animalSupplier.get();
            animal.sound();
        } else {
            System.out.println("输入的动物不存在!");
            new Animal().sound();
        }
        scan.close();
    }
}

注意:确保所有子类与AnimalTest在同一个包下,或者在AnimalTest中通过import语句导入对应的子类。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:29:52