Java多态主要解决代码耦合度高、扩展性差的问题,核心是让程序依赖抽象而非具体实现,从而支持"对扩展开放,对修改关闭"。
解决的核心问题
| 问题 | 说明 |
|---|---|
| 代码重复 | 避免为每种类型写重复的分支判断 |
| 耦合严重 | 调用方无需知道对象的具体类型 |
| 扩展困难 | 新增类型时无需修改现有代码 |
| 可维护差 | 逻辑分散在各处,一改多处动 |
经典示例:支付系统
不用多态(问题代码):
java
public class OrderService {
public void pay(String type) {
if ("alipay".equals(type)) {
// 20行支付宝逻辑
} else if ("wechat".equals(type)) {
// 20行微信逻辑
} else if ("card".equals(type)) {
// 20行银行卡逻辑
}
// 每加一种支付,都要改这里!
}
}
使用多态:
java
// 1. 抽象
public interface Payment {
void pay(BigDecimal amount);
}
// 2. 具体实现(新增时只加这个)
public class Alipay implements Payment {
public void pay(BigDecimal amount) {
// 支付宝逻辑
}
}
public class WechatPay implements Payment {
public void pay(BigDecimal amount) {
// 微信逻辑
}
}
// 3. 调用方完全解耦
public class OrderService {
public void pay(Payment payment, BigDecimal amount) {
payment.pay(amount); // 自动调用实际类型的方法
}
}
// 使用
OrderService service = new OrderService();
service.pay(new Alipay(), new BigDecimal("100")); // 支付宝
service.pay(new WechatPay(), new BigDecimal("100")); // 微信
多态的三种体现
java
// 1. 方法重写(Override)------ 运行时多态
Animal a = new Dog(); // 父类引用指向子类对象
a.speak(); // "汪汪" ------ 实际调用Dog的方法
// 2. 方法重载(Overload)------ 编译时多态
void print(int x) { }
void print(String s) { }
// 3. 接口实现
List<String> list = new ArrayList<>(); // 面向接口编程
实际应用场景
| 场景 | 多态的作用 |
|---|---|
| Spring依赖注入 | UserService 注入不同实现的 UserDao |
| JDBC | Connection conn = DriverManager.getConnection(...) 不同数据库驱动 |
| 日志框架 | Logger 可以是 Logback、Log4j2 等 |
| 策略模式 | 排序算法切换、折扣规则切换 |
一句话总结: 多态让你写一次通用逻辑,未来新类型自动适配,代码像搭积木一样扩展。