编译时多态(方法重载)

同一个类中,方法名相同但参数列表不同(类型、个数或顺序)。编译时根据参数决定调用哪个方法。

方法重载
public class Calculator {
    // 方法名相同,参数不同
    public int add(int a, int b) {
        return a + b;
    }

    public double add(double a, double b) {
        return a + b;
    }

    public int add(int a, int b, int c) {
        return a + b + c;
    }
}

// 使用
Calculator calc = new Calculator();
int sum1 = calc.add(1, 2);           // 调用第一个
double sum2 = calc.add(1.5, 2.5);   // 调用第二个
int sum3 = calc.add(1, 2, 3);       // 调用第三个

运行时多态(方法重写 + 向上转型)

子类重写父类方法,父类引用指向子类对象。运行时根据实际对象类型决定调用哪个方法。

运行时多态
// 父类引用指向子类对象(向上转型)
Animal animal1 = new Dog();
Animal animal2 = new Cat();

animal1.eat();  // 实际调用 Dog 的 eat()
animal2.eat();  // 实际调用 Cat 的 eat()

// 应用:多态数组
Animal[] animals = new Animal[3];
animals[0] = new Dog();
animals[1] = new Cat();
animals[2] = new Dog();

for (Animal animal : animals) {
    animal.eat();  // 根据实际对象类型调用不同方法
}
💡 多态的前提条件

1. 有继承关系(或实现接口)
2. 子类重写父类方法
3. 父类引用指向子类对象

课后练习

以下代码的输出是什么?

代码片段
class Animal {
    void speak() {
        System.out.print("Animal");
    }
}
class Dog extends Animal {
    @Override
    void speak() {
        System.out.print("Dog");
    }
}
Animal a = new Dog();
a.speak();
A Animal
B Dog
C 编译错误
D AnimalDog