抽象类通过抽取共性字段和方法实现代码复用与流程约束:统一声明id、时间戳等字段并初始化,提供默认逻辑方法,结合模板方法模式固定流程、开放定制点,并可与接口组合使用以兼顾复用性和灵活性。

抽象类通过抽取多个子类共有的属性和行为,把重复代码“上提”到父层,子类直接继承使用,避免各自重复定义。关键不在于它能不能实例化,而在于它怎么组织共性、约束个性。
把通用字段统一声明在抽象类里
比如用户、订单、文章等实体都带 id、创建时间、更新时间,这些字段不是每个类都自己写一遍,而是集中定义在抽象基类中:
- 用 protected 或 public 修饰,确保子类能直接访问或通过 getter/setter 使用
- 字段初始化可放在抽象类构造器中(如自动设 createdDate = new Date())
- 子类继承后,无需再声明 id、createdDate 等字段,也不用重写对应 setter/getter
提供默认实现的方法来复用逻辑
有些行为所有子类都一样,比如“生成唯一编号”“格式化创建时间”,就可以在抽象类里直接写好方法:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 普通方法(非 abstract)可被子类直接调用,无需重写
- 例如:public String getFormattedCreatedDate() { return new SimpleDateFormat("yyyy-MM-dd").format(createdDate); }
- 这样 User、Order、Product 都能直接用,不用各自复制粘贴日期格式化逻辑
配合模板方法模式,固定流程+开放定制点
抽象类可以定义完整业务骨架,把变化的部分留给子类实现:
- 比如 save() 方法整体流程固定:校验 → 生成 ID → 设置时间戳 → 写库;其中“校验规则”因实体而异
- 抽象类写:public final void save() { validate(); generateId(); setTimestamps(); doSave(); }
- 其中 validate() 和 doSave() 声明为 abstract,强制子类实现;其余复用
- 既防止流程错乱,又避免每个子类都重复写“生成 ID + 设时间戳”这段逻辑
和接口组合使用,兼顾复用与契约
纯公共属性适合放抽象类,而跨领域能力(如“可审计”“可导出”)更适合用接口:
- 抽象类 BaseAuditEntity 提供 id、createdDate、modifiedDate 字段和基础 setter
- 接口 Auditable 只声明 getCreatedBy()、setModifiedBy(...) 等契约
- 子类 extends BaseAuditEntity implements Auditable,字段复用 + 行为契约两不误
- 比全靠接口更省事(接口不能存字段),比全靠抽象类更灵活(一个类可实现多个接口)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










