多态与继承之间的联系与区别

287 阅读3分钟

一、继承与多态之间的关系

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 后,可以直接复用 Animaleat() 方法。
  • 多态

    • 解决行为多样化问题。
    • 例如:DogCat 继承 Animal 后,各自重写 sound() 方法,表现出不同行为。

2. 绑定时机不同

  • 继承的静态绑定

    • 编译时确定类之间的关系(如 DogAnimal 的子类)。
  • 多态的动态绑定

    • 运行时根据对象的实际类型调用方法(如 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”关系(狗是动物)支持“开闭原则”(对扩展开放,修改关闭)