Java多态通过父类/接口统一抽象行为,使不同子类按需实现(如Promotion的apply方法),配合集合泛型调度和运行时绑定,新增类型无需修改原有代码;谨慎向下转型并优先用扩展点或策略模式;Jackson可通过@JsonTypeInfo实现JSON多态序列化。

Java 中多态处理复杂对象逻辑,核心在于用统一接口或父类类型管理不同行为的子类实例,避免硬编码判断,让运行时自动选择具体实现。关键不是“怎么写”,而是“怎么组织结构”和“怎么安全调用”。
用父类/接口统一抽象行为
把复杂对象共有的操作(如计算、校验、渲染、序列化)抽成抽象方法,由各子类按自身逻辑实现。比如订单系统中,Promotion 抽象类定义 apply(Order order),子类 CouponPromotion、DiscountPromotion、PointsPromotion 各自实现折扣逻辑。调用方只需传入 Promotion 引用,无需 if-else 判断类型。
配合 Collections 和泛型统一调度
把不同子类对象存入 List<Promotion> 或 Map<String, Promotion>,遍历时直接调用 apply()。JVM 在运行时自动绑定到对应子类方法。这样新增促销类型时,只需加一个子类和注册逻辑,原有结算代码完全不动。
谨慎使用向下转型访问子类特有功能
多态下父类引用无法直接调用子类独有方法(如 Dog.guard())。若必须调用,先用 instanceof 判断类型,再强制转型:
立即学习“Java免费学习笔记(深入)”;
if (animal instanceof Dog) { ((Dog) animal).guard(); }- 避免无条件强转,否则抛
ClassCastException - 更推荐在父类中预留扩展点(如添加
isGuardingCapable()方法),或改用策略模式解耦
结合 Jackson 实现 JSON 多态序列化
当复杂对象需转为 JSON(如 REST API 响应),用 @JsonTypeInfo 和 @JsonSubTypes 注解声明类型信息:
- 在基类上标注
@JsonTypeInfo(use = NAME, property = "type") - 列出所有子类映射:
@JsonSubTypes({@Type(Dog.class, name="dog"), @Type(Cat.class, name="cat")}) - 序列化后 JSON 自动带
"type": "dog"字段,反序列化时 Jackson 能准确还原为Dog实例


















