好的阿杰 👍
我来给你写一份 Java 多态(Polymorphism)详解,从概念、实现方式到实际应用,一步步讲清楚。


🟦 Java 多态详解

1️⃣ 什么是多态?

多态 = “一个接口,多种实现”
简单来说,就是 同一个方法调用,不同对象表现出不同的行为

👉 生活类比:
“交通工具”都有 run() 方法,但汽车是“在路上跑 🚗”,飞机是“在天上飞 ✈️”,船是“在水上开 🚢”。


2️⃣ 多态的前提条件

Java 中实现多态必须满足三个条件:

  1. 继承/实现:类之间必须有继承关系或实现接口。
  2. 方法重写(override):子类要重写父类/接口中的方法。
  3. 父类引用指向子类对象父类类型 变量名 = new 子类对象();

3️⃣ 多态的基本示例

class Animal {
    public void sound() {
        System.out.println("动物在叫");
    }
}

class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("汪汪汪!");
    }
}

class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("喵喵喵!");
    }
}

public class TestPolymorphism {
    public static void main(String[] args) {
        Animal a1 = new Dog();  // 父类引用 -> 子类对象
        Animal a2 = new Cat();

        a1.sound(); // 汪汪汪!
        a2.sound(); // 喵喵喵!
    }
}

👉 同一个方法 sound(),不同对象有不同表现,这就是多态。


4️⃣ 多态的好处

  1. 代码复用:父类定义统一接口,子类实现不同逻辑。
  2. 扩展性好:新增子类时,不需要修改父类或调用者代码。
  3. 更灵活:调用时不关心具体对象,只关心接口/父类。

5️⃣ 多态中的类型转换

向上转型(Upcasting)

  • 子类对象赋给父类引用(自动完成)。
Animal a = new Dog();  // 向上转型
a.sound();             // 调用 Dog 的方法

向下转型(Downcasting)

  • 父类引用转回子类引用(需要强制类型转换)。
Animal a = new Dog();
Dog d = (Dog) a;   // 向下转型
d.sound();         // 汪汪汪!

⚠️ 注意:向下转型前必须用 instanceof 判断类型,否则可能抛 ClassCastException


6️⃣ 方法重写与多态

多态依赖 方法重写(override)

  • 方法名相同、参数列表相同。
  • 子类方法访问权限不能比父类更严格。
  • 返回值类型可以相同或是父类的子类(协变返回类型)。

7️⃣ 多态与抽象类、接口

  • 抽象类:定义抽象方法,子类必须实现,常用来配合多态。
  • 接口:定义行为规范,多种实现类通过接口多态调用。

示例(接口多态):

interface USB {
    void connect();
}

class Mouse implements USB {
    public void connect() {
        System.out.println("鼠标连接成功");
    }
}

class Keyboard implements USB {
    public void connect() {
        System.out.println("键盘连接成功");
    }
}

public class TestUSB {
    public static void main(String[] args) {
        USB u1 = new Mouse();
        USB u2 = new Keyboard();

        u1.connect();
        u2.connect();
    }
}


8️⃣ 多态的实际应用

  1. JDBCConnection conn = DriverManager.getConnection(...) → 实际返回 MySQL、Oracle、PostgreSQL 等不同实现。
  2. 集合框架List<String> list = new ArrayList<>(); → 也可以换成 LinkedList,调用代码不变。
  3. 设计模式:工厂模式、策略模式、模板方法模式都依赖多态。

📝 总结

  • 多态的本质:父类引用指向子类对象,调用方法时执行子类的实现。
  • 条件:继承 + 方法重写 + 父类引用指向子类对象。
  • 好处:提高复用性、扩展性和灵活性。
  • 应用:JDBC、集合、设计模式。