多态

2023/10/20

# 1 多态

多态是面向对象编程中的一个核心概念,它指的是同一个接口可以被不同的对象实例所实现,表现出不同的行为。这通常是通过“继承”和“方法重写”实现的,允许在基类中定义一个方法,并在一个或多个派生类中重写该方法。因此,当客户代码调用该方法时,实际执行的方法取决于用于调用方法的对象的类型。

让我们通过一个简单的例子来理解多态:

假设我们有一个“动物园”程序,它包含各种动物,每种动物都会叫。我们可能有一个基类Animal和几个派生类,如DogCatBird。在基类中,我们可能有一个方法makeSound(),并在每个派生类中重写这个方法,以实现每种动物特有的叫声。

java

// Java代码示例

// 基类(或接口)
abstract class Animal {
    // 每个动物都应该实现这个方法以发出声音
    public abstract void makeSound();
}

// 派生类1
class Dog extends Animal {
    // 狗的具体实现
    public void makeSound() {
        System.out.println("Woof!");
    }
}

// 派生类2
class Cat extends Animal {
    // 猫的具体实现
    public void makeSound() {
        System.out.println("Meow!");
    }
}

// 派生类3
class Bird extends Animal {
    // 鸟的具体实现
    public void makeSound() {
        System.out.println("Chirp!");
    }
}

public class Zoo {
    public static void main(String[] args) {
        // 创建具体动物的实例
        Animal myDog = new Dog();
        Animal myCat = new Cat();
        Animal myBird = new Bird();

        // 我们可以通过动物类型的引用来调用具体动物的makeSound方法
        myDog.makeSound();  // 输出: Woof!
        myCat.makeSound();  // 输出: Meow!
        myBird.makeSound(); // 输出: Chirp!
    }
}

在这个例子中,makeSound 方法是多态的。基类 Animal 定义了一个期望的接口(即 makeSound 方法),具体的实现由其子类(DogCatBird)提供。当调用一个动物的 makeSound 方法时,实际上调用的是那个特定类型的动物的方法实现。

这就是多态的强大之处:你可以编写操作基类的代码(例如,一个方法接受一个 Animal 类型的参数),并且它会与任何子类对象一起工作,无论子类的具体实现如何。这大大增加了代码的灵活性和可扩展性。