抽象类通过提取共性逻辑、提供默认实现和统一结构设计降低子类重复率;封装公共属性与方法、定义模板方法、强制关键行为并提供默认实现,支持带状态的复用,优于纯接口且应避免过度继承。

抽象类通过提取共性逻辑、提供默认实现和统一结构设计,直接降低子类代码重复率。它不是简单地“让子类少写几行”,而是从架构层面把可复用的部分收归一处,让子类只专注自己独有的行为。
封装公共属性与方法
多个子类共有的字段(如 ID、创建时间、状态)和基础操作(如日志记录、参数校验、空值检查),可以直接定义在抽象父类中。子类继承后自动获得这些能力,无需各自重复声明或实现。
- 例如图形系统中,颜色、边框宽度、是否可见等通用属性放在
AbstractShape中,Circle和Rectangle只需关注绘制逻辑 - 工具方法如
validateNotNull()、formatTimestamp()可设为protected,供子类按需调用
定义模板方法统一流程
当多个子类执行相似步骤(如“加载→处理→保存→通知”),但每步具体实现不同,可用模板方法模式:抽象类中写好骨架,用 final 锁定流程顺序,把变化点声明为 abstract 或 protected 方法,由子类实现。
- 比如导出功能:
export()是final方法,内部调用prepareData()、writeToFile()、sendSuccessNotice();其中只有writeToFile()是抽象的,CsvExporter和PdfExporter各自实现即可 - 避免子类各自写一套流程控制,又容易漏掉某一步或顺序错乱
强制关键行为 + 提供默认实现混合使用
抽象类既能用抽象方法确保子类“必须做某事”(如 authenticate()、calculateFee()),也能为非核心但高频的操作提供默认实现(如通用重试逻辑、HTTP 请求头组装、JSON 解析封装)。
立即学习“Java免费学习笔记(深入)”;
- 支付子类必须实现
doPayment(),但父类已提供buildRequestHeader()和handleTimeout(),子类不用再重复处理网络层细节 - 相比纯接口,抽象类支持带状态的默认实现,比如维护一个共享的连接池或缓存容器
替代部分接口 + 避免过度继承
当一组类既需要共享代码,又需要某种契约约束时,抽象类比接口更合适——它天然支持字段、构造器、静态块、受保护方法,还能组合其他抽象类或接口。
- 日志处理器中,
AbstractLogger提供formatMessage()默认实现和level字段,子类只需决定输出到文件还是远程服务 - 不建议让抽象类层级过深(如 A → B → C → D),通常一层父类足矣;深层继承反而增加理解成本和修改风险


















