好的阿杰 👍
我来给你写一份 Java 多态(Polymorphism)详解,从概念、实现方式到实际应用,一步步讲清楚。
🟦 Java 多态详解
1️⃣ 什么是多态?
多态 = “一个接口,多种实现”。
简单来说,就是 同一个方法调用,不同对象表现出不同的行为。
👉 生活类比:
“交通工具”都有 run()
方法,但汽车是“在路上跑 🚗”,飞机是“在天上飞 ✈️”,船是“在水上开 🚢”。
2️⃣ 多态的前提条件
Java 中实现多态必须满足三个条件:
- 继承/实现:类之间必须有继承关系或实现接口。
- 方法重写(override):子类要重写父类/接口中的方法。
- 父类引用指向子类对象:
父类类型 变量名 = 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️⃣ 多态的好处
- 代码复用:父类定义统一接口,子类实现不同逻辑。
- 扩展性好:新增子类时,不需要修改父类或调用者代码。
- 更灵活:调用时不关心具体对象,只关心接口/父类。
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️⃣ 多态的实际应用
- JDBC:
Connection conn = DriverManager.getConnection(...)
→ 实际返回 MySQL、Oracle、PostgreSQL 等不同实现。 - 集合框架:
List<String> list = new ArrayList<>();
→ 也可以换成LinkedList
,调用代码不变。 - 设计模式:工厂模式、策略模式、模板方法模式都依赖多态。
📝 总结
- 多态的本质:父类引用指向子类对象,调用方法时执行子类的实现。
- 条件:继承 + 方法重写 + 父类引用指向子类对象。
- 好处:提高复用性、扩展性和灵活性。
- 应用:JDBC、集合、设计模式。
发表回复