java多态通过父类引用指向子类对象和方法重写实现动态绑定,核心是运行时根据实际类型调用对应方法;接口方式更灵活,支持无关类共享行为;应避免instanceof+强制转换,推荐提取共性方法到父类或接口;结合策略模式可提升可扩展性。

Java 中多态通过“父类引用指向子类对象” + “方法重写(Override)”实现运行时根据实际类型执行不同逻辑,核心是动态绑定(Dynamic Method Dispatch)。
基于继承和方法重写
这是最常用的方式:定义统一的父类或接口,各子类重写同一方法,调用时 JVM 根据对象实际类型决定执行哪个版本。
- 父类(或接口)声明通用方法签名,不关注具体实现
- 每个子类用 @Override 提供自己的逻辑,比如
pay()在Alipay、WeChatPay、CardPay中行为不同 - 调用方只面向父类/接口编程,例如
Payment p = new WeChatPay(); p.pay();,无需 if-else 判断类型
使用接口统一行为契约
比继承更灵活,适合无关类之间共享行为。多个类实现同一接口,各自实现逻辑,多态效果一致。
- 定义
interface Shape { double area(); } -
Circle、Rectangle、Triangle分别实现area(),计算方式完全不同 - 可统一处理:
List<shape> shapes = Arrays.asList(new Circle(2), new Rectangle(3,4)); shapes.forEach(s -> System.out.println(s.area()));</shape>
避免 instanceof + 强制转换(反模式)
手动判断类型再转型调用特定方法,破坏了多态初衷,耦合高、难扩展。
- ❌ 错误示例:
if (obj instanceof Dog) ((Dog)obj).bark(); else if (obj instanceof Cat) ((Cat)obj).meow(); - ✅ 正确做法:提取共性方法(如
makeSound())到父类或接口,由子类各自实现 - 这种写法一旦新增类型(比如
Bird),就得改所有 if-else,违反开闭原则
结合策略模式增强可扩展性
当逻辑复杂或需运行时切换行为时,把多态对象作为策略注入,进一步解耦。
- 定义策略接口
DiscountStrategy,实现类有SeasonalDiscount、VipDiscount等 - 业务类持有一个
DiscountStrategy引用,运行时替换策略实例 - 新增折扣类型只需加实现类,不修改原有业务代码
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











