抽象类通过普通方法提供默认实现,封装通用逻辑供子类复用;abstract方法定义扩展点;模板方法模式用final方法约束流程,结合abstract与有默认实现的钩子方法实现灵活扩展。

在抽象类中提供默认实现,核心是用 普通方法(非 abstract)封装通用逻辑,让子类按需选择覆写或直接复用。
用具体方法提供可复用的默认行为
抽象类允许同时包含 abstract 方法和具体方法。具体方法天然具备默认实现,子类继承后可直接调用,无需强制重写。
- 把多数子类共用的逻辑(如日志、参数校验、模板流程)写成普通方法
- 把真正需要差异化的行为声明为 abstract,留给子类决定
- 例如:一个支付抽象类可提供
formatAmount()或logTransaction()这类通用方法,而doPay()保持 abstract
用模板方法模式控制执行流程
定义一个 final 的模板方法,内部调用若干钩子方法(部分 abstract,部分有默认实现),从而既约束流程,又保留扩展点。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 模板方法本身用
final防止子类覆盖整体流程 - 其中调用的
beforeProcess()和afterProcess()可设为 protected + 有空实现,子类只覆写需要的部分 -
coreProcess()设为 abstract,确保子类必须实现核心逻辑
用 default 方法?注意:那是接口的特性
Java 8+ 接口中可用 default 方法提供默认实现,但抽象类不支持 default 关键字。抽象类靠的是普通实例方法或静态方法来达成类似效果。
- 别混淆概念:abstract class 中没有 default 方法语法
- 想用 default 方法,得改用 interface;但 interface 不能有构造器、不能存状态(除非 static/final 字段),适用场景不同
- 如果既要状态又要默认行为,抽象类 + 具体方法仍是更自然的选择
合理设计抽象层级,避免过度抽象
不是所有方法都该放进抽象类。只把真正稳定、复用率高、且与类职责强相关的逻辑做成默认实现。
- 频繁变更或业务差异大的逻辑,不适合放默认实现
- 工具类方法(如字符串处理、时间格式化)更适合抽到工具类,而非塞进抽象类
- 默认实现应尽量无副作用、易测试、不依赖子类特有字段
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










