一、继承与多态之间的关系
1. 继承是多态的基础
-
继承是子类复用父类代码的机制,而多态是继承的扩展和动态行为表现。
-
多态的实现依赖继承:
- 子类通过继承父类,重写父类方法(
@Override),从而在运行时表现出多态性。 -
class Animal { void sound() { ... } } class Dog extends Animal { @Override void sound() { System.out.println("Bark"); } } // 多态调用 Animal animal = new Dog(); animal.sound(); // 实际调用 Dog 的 sound()
- 子类通过继承父类,重写父类方法(
2. 多态是继承的“高级应用”
-
继承提供了代码复用的结构,而多态通过动态绑定(运行时行为)让代码更加灵活和可扩展。
-
多态的价值:
- 允许用父类引用操作子类对象,统一处理不同子类的逻辑。
- 例如:
List<String> list = new ArrayList<>();(多态的应用)。
二、继承与多态的区别
| 特性 | 继承(Inheritance) | 多态(Polymorphism) |
|---|---|---|
| 核心目标 | 代码复用、建立类层次结构 | 同一接口的不同实现,动态行为 |
| 实现方式 | 子类继承父类的属性和方法 | 方法重写(@Override)或接口实现 |
| 绑定时机 | 静态绑定(编译时确定类结构) | 动态绑定(运行时确定实际调用的方法) |
| 依赖关系 | 多态依赖继承(或接口) | 继承不依赖多态(可以独立存在) |
| 代码灵活性 | 提供代码复用,但静态 | 提供动态扩展,适应变化的需求 |
| 典型应用场景 | 构建类的层次结构(如动物 → 狗、猫) | 统一处理不同子类对象(如遍历集合调用方法) |
三、关键区别的详细说明
1. 目标不同
-
继承:
- 解决代码复用问题。
- 例如:
Dog继承Animal后,可以直接复用Animal的eat()方法。
-
多态:
- 解决行为多样化问题。
- 例如:
Dog和Cat继承Animal后,各自重写sound()方法,表现出不同行为。
2. 绑定时机不同
-
继承的静态绑定:
- 编译时确定类之间的关系(如
Dog是Animal的子类)。
- 编译时确定类之间的关系(如
-
多态的动态绑定:
- 运行时根据对象的实际类型调用方法(如
Animal animal = new Dog(); animal.sound()调用的是Dog的方法)。
- 运行时根据对象的实际类型调用方法(如
3. 依赖方向
-
多态必须依赖继承(或接口),但继承可以不涉及多态。
- 例如:子类可以直接调用父类方法而不重写,此时没有多态。
四、实际代码示例
1. 仅继承(无多态)
class Vehicle {
void start() { System.out.println("Vehicle starts"); }
}
class Car extends Vehicle {
// 未重写 start() 方法
}
public class Test {
public static void main(String[] args) {
Car car = new Car();
car.start(); // 直接调用父类方法,无多态
}
}
2. 继承 + 多态
class Vehicle {
void start() { System.out.println("Vehicle starts"); }
}
class Car extends Vehicle {
@Override
void start() { System.out.println("Car starts with ignition"); }
}
class Bike extends Vehicle {
@Override
void start() { System.out.println("Bike starts by pedaling"); }
}
public class Test {
public static void main(String[] args) {
Vehicle v1 = new Car(); // 向上转型
Vehicle v2 = new Bike();
v1.start(); // 输出 "Car starts with ignition"(多态)
v2.start(); // 输出 "Bike starts by pedaling"
}
}
五、总结
| 维度 | 继承 | 多态 |
|---|---|---|
| 核心 | 代码复用和层次化设计 | 动态行为扩展和接口统一 |
| 实现手段 | extends 关键字 | 方法重写(@Override)+ 向上转型 |
| 本质 | 是什么(类之间的关系) | 怎么做(方法的不同实现) |
| 设计原则 | 支持“is-a”关系(狗是动物) | 支持“开闭原则”(对扩展开放,修改关闭) |