多态的概念
定义:
它允许不同的对象对同一操作或方法调用做出响应,但具体的行为会根据对象的实际类型而有所不同。多态性提供了一种方式,使得代码能够以统一的接口与不同的数据类型交互,而不需要关心这些数据类型背后的具体实现细节。
多态的好处:
- 提高代码的可读性和可维护性。
- 降低代码间的耦合度,增加模块化。
- 允许扩展现有代码而无需修改现有逻辑。
例:
// 定义一个动物的抽象类
abstract class Animal {
// 抽象方法,具体实现由子类提供
abstract void makeSound();
// 一个具体的方法,可以在子类中直接使用
void eat() {
System.out.println("This animal eats food.");
}
}
// 定义一个狗类,继承自Animal类
class Dog extends Animal {
// 重写makeSound方法,提供狗的叫声
@Override
void makeSound() {
System.out.println("Woof woof!");
}
}
// 定义一个猫类,继承自Animal类
class Cat extends Animal {
// 重写makeSound方法,提供猫的叫声
@Override
void makeSound() {
System.out.println("Meow meow!");
}
}
// 主类,用于演示多态
public class PolymorphismDemo {
public static void main(String[] args) {
// 创建Animal类型的数组,但实际存储的是Dog和Cat对象
Animal[] animals = {new Dog(), new Cat()};
// 遍历数组,多态性在这里体现:尽管引用类型是Animal,但实际调用的方法是对象实际类型的makeSound
for (Animal animal : animals) {
animal.makeSound(); // 运行时多态
animal.eat(); // 编译时多态,因为eat方法在Animal类中定义
}
}
}
在这个示例中:
Animal
是一个抽象类,它定义了一个抽象方法makeSound()
和一个具体方法eat()
。Dog
和Cat
是Animal
的子类,它们重写了makeSound()
方法,提供了具体的叫声实现。PolymorphismDemo
类中的main
方法创建了一个Animal
类型的数组,但实际存储的是Dog
和Cat
的对象。- 通过
Animal
类型的引用调用makeSound()
方法时,由于多态性,实际执行的是每个对象实际类型的makeSound()
方法。这就是运行时多态的一个例子。 - 同时,调用
eat()
方法时,由于这个方法在Animal
类中已经定义,所以这是编译时多态的一个例子。