public class Animal {
    public void makeSound() {
        System.out.println("动物发出声音");
    }
}

public class Dog extends Animal {
    public void makeSound() {
        System.out.println("狗发出汪汪声");
    }
}

public class Cat extends Animal {
    public void makeSound() {
        System.out.println("猫发出喵喵声");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Animal();
        Animal animal2 = new Dog();
        Animal animal3 = new Cat();
        
        animal1.makeSound(); // 动物发出声音
        animal2.makeSound(); // 狗发出汪汪声
        animal3.makeSound(); // 猫发出喵喵声
    }
}

在上述代码中,Animal类是一个基类,Dog和Cat是它的子类。基类中定义了一个makeSound方法,而子类则对该方法进行了重写。在主函数中,我们创建了一个Animal对象和两个子类对象,并调用它们的makeSound方法。

通过多态的机制,animal2和animal3虽然被声明为Animal类型的对象,但实际上引用的是Dog和Cat的实例。因此,当调用makeSound方法时,会根据实际的对象类型而执行相应的子类方法,实现了多态。

多态的应用可以在面向对象的编程中发挥重要作用。它允许我们以一种通用的方式编写代码,使代码更加灵活、可复用,并可以根据需求动态选择合适的实现。