Java测试类疑问:如何在AnimalTest中创建Animal子类实例
解决动态创建Animal子类并调用sound()的问题
先修正你现有代码里的几个基础问题,符合Java编码规范:
- 类名必须用大驼峰命名:把
cow、pig、sheep、duck改成Cow、Pig、Sheep、Duck,避免潜在的编译或逻辑问题 - 父类Animal里的
animal()方法和main方法可以删除,作业要求的是带默认sound()的父类,测试逻辑统一放在AnimalTest中 - 子类重写
sound()时加上@Override注解,明确标记是重写父类方法,既规范又能让编译器帮你检查重写是否正确 - 子类字符串中的双引号需要转义,比如
"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
相关产品推荐
相关产品推荐

