//定义抽象类 Animal abstract class Animal { // 抽象方法:没有方法体,子类必须实现 public abstract void makeSound(); } //定义接口 Swimmable interface Swimmable { // 接口中的方法默认是 public abstract void swim(); } // Dog 类继承 Animal,并实现 Swimmable class Dog extends Animal implements Swimmable { // 实现抽象方法 makeSound() @Override public void makeSound() { System.out.println("汪汪汪!"); } // 实现接口中的 swim() 方法 @Override public void swim() { System.out.println("狗会游泳,正在狗刨..."); } } // Cat 类只继承 Animal,不实现 Swimmable class Cat extends Animal { // 实现抽象方法 makeSound() @Override public void makeSound() { System.out.println("喵喵喵~"); } } // 主类(测试类) public class AnimalTest { public static void main(String[] args) { System.out.println("=== 动物叫声系统 ===\n"); // 多态:父类引用指向子类对象 Animal animal1 = new Dog(); Animal animal2 = new Cat(); // 调用 makeSound() - 表现出不同的行为 System.out.println("狗的声音:"); animal1.makeSound(); // 输出:汪汪汪! System.out.println("\n猫的声音:"); animal2.makeSound(); // 输出:喵喵喵~ // 测试游泳能力(需要向下转型) System.out.println("\n=== 游泳测试 ==="); // Dog 实现了 Swimmable,可以游泳 if (animal1 instanceof Swimmable) { Swimmable swimmer = (Swimmable) animal1; // 向下转型 swimmer.swim(); // 输出:狗会游泳,正在狗刨... } // Cat 没有实现 Swimmable,不能游泳 if (animal2 instanceof Swimmable) { System.out.println("猫会游泳"); // 不会执行 } else { System.out.println("猫不会游泳"); // 输出:猫不会游泳 } // 演示直接使用子类引用 System.out.println("\n=== 直接调用 ==="); Dog dog = new Dog(); dog.makeSound(); // 汪汪汪! dog.swim(); // 狗会游泳,正在狗刨... Cat cat = new Cat(); cat.makeSound(); // 喵喵喵~ // cat.swim(); // 编译错误!Cat没有swim方法 } }