继承与多态是支撑业务系统可维护、可演进的底层骨架,前者通过“is-a”关系复用共性能力,后者通过统一接口实现运行时弹性扩展,二者结合降低耦合、提升可扩展性。

继承与多态不是语法玩具,而是支撑真实业务系统可维护、可演进的底层骨架。
继承让代码结构更贴近现实逻辑
它把“is-a”关系翻译成代码——比如User和Admin都属于用户体系,Admin自然继承User的登录、基本信息等共性能力;又比如PaymentService下分AlipayService、WechatPayService,它们共享统一的支付流程入口,但各自封装渠道特有逻辑。这种设计避免了重复定义字段和基础方法,也使新增角色(如Editor)只需继承并补充权限逻辑,无需重写整个用户模块。
多态让系统扩展不碰原有代码
当调用方只依赖父类或接口类型时,新增实现不会触发连锁修改。例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 一个订单结算方法接收PaymentStrategy参数,现在支持支付宝,明天加银联,后天接数字货币——只要新类实现该接口,传入即可,结算主逻辑完全不动;
- 日志记录器接收Logger接口,开发环境用ConsoleLogger,生产环境切到FileLogger或KafkaLogger,切换只需改一行注入配置;
- Spring中@Service标注的多个实现类,通过@Qualifier或泛型自动装配,运行时按需选择,上层无感知。
二者结合降低模块耦合度
继承提供共性骨架,多态赋予运行时弹性。典型场景如风控规则引擎:
- 定义抽象类RiskRule,含evaluate()模板方法和钩子方法;
- 子类CreditScoreRule、LocationAnomalyRule分别实现具体判断逻辑;
- 主流程遍历List
统一调用evaluate(),不关心每个规则是谁、怎么算——新增规则只需加个子类,注册进集合,其他代码零改动。
实际落地要注意的边界
不是所有“相似”都该用继承,过度继承反而僵化:
- 优先组合优于继承:比如Order“有”Address,而不是继承Address;
- 父类保持稳定:公共方法尽量定义为final或明确契约,避免子类随意覆盖破坏一致性;
- 多态依赖清晰契约:接口方法命名、参数语义、异常范围要严谨,否则运行时类型错配难排查;
- 慎用深层继承链:三层以上继承容易导致理解成本高、调试路径长,建议用接口+默认方法替代部分层级。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










