抽象类通过abstract方法强制子类实现契约,模板方法锁住流程骨架,钩子方法提供可选扩展,继承链中责任逐级传递且最终由具体子类兑现。

靠抽象类加继承,能把规范真正“钉死”在编译阶段——不是靠文档提醒、不是靠代码审查,而是子类不按规矩写,连编译都过不去。
抽象类是契约的载体
只要在抽象类里声明一个 abstract 方法,整个类就必须用 abstract class 修饰。这个方法不能有方法体(不能带 {}),也不能是 private、static 或 final——否则子类根本没法重写。
- 访问修饰符必须是 public 或 protected,确保子类能看见、能覆盖
- 返回类型支持协变(比如父类返回 Number,子类可返回 Integer),但不能随意换成无关类型
- 参数列表必须完全一致,List
和自定义 List 类型不视为相同签名
模板方法锁住流程骨架
光有抽象方法只能卡住“有没有实现”,管不住“什么时候调、前后做什么”。真正落地要靠模板方法:把不变逻辑写成 final 方法,把变化点留成 abstract 方法。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 比如统一的消息发送流程:preCheck() → doSend() → postLog(),其中只有 doSend() 是 abstract 的
- 子类只专注自己的发送逻辑,不用重复写校验、日志、异常包装等公共动作
- 主干逻辑一旦修改,所有子类自动受益,不会遗漏或错位
钩子方法区分“必须”和“可选”
除了强制实现的抽象方法,基类还可以提供空的 protected 方法作为扩展点,子类按需重写,不破坏契约。
- 例如:protected void afterSuccess(Order order) { }
- 风控模块重写它加审计日志,普通业务保持默认即可
- 命名建议用 onXXX 或 afterXXX 前缀,语义清晰,一眼可知用途
继承链中责任传递要清晰
抽象方法的约束会沿继承链向下传递,但最终必须由某个具体子类全部兑现。
- 中间抽象子类(比如 Mammal extends Animal)可以不实现,作为设计缓冲层
- 一旦子类去掉 abstract 修饰,就必须实现自己及所有祖先类中所有未实现的抽象方法
- 切忌在抽象类构造器里调用抽象方法——此时子类字段还没初始化,极易触发 NullPointerException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










