抽象类通过提供具体方法、封装共享状态与逻辑、统一初始化流程来提升复用性:定义具体方法供子类直接调用(如breathe()),组合抽象与具体方法构成模板流程(如performdailyroutine()),封装protected字段与工具逻辑(如nextid()),并利用构造器执行公共初始化。

抽象类通过提供可继承的具体方法、封装共享状态与逻辑、统一初始化流程,让子类直接复用而不重复编写相同代码。关键不在于“能不能写实现”,而在于“哪些该由父层定死,哪些该留给子类定制”。
定义具体方法供子类直接调用
抽象类中可以声明带完整方法体的普通方法,子类自动继承,无需重写就能使用。
- 比如 Animal 抽象类里写一个 breathe() 方法,所有子类(Dog、Cat、Bird)都默认具备呼吸能力
- 子类内部可通过 super.breathe() 显式调用,也可在其基础上扩展,比如先喘气再叫唤
- 避免每个子类都写一遍相同的日志打印、参数校验或基础状态更新逻辑
组合抽象方法 + 具体方法构成模板流程
把稳定不变的执行顺序写成具体方法,把变化的部分留作 abstract 方法,形成“骨架固定、细节可插拔”的结构。
- 例如 performDailyRoutine() 是具体方法:内部按顺序调用 wakeUp() → makeSound() → sleep()
- 其中 wakeUp() 和 sleep() 是具体实现,makeSound() 是 abstract 方法,由子类各自实现
- 新增 Lion 类时,只关注怎么吼,不用重新组织起床-发声-睡觉这个流程
封装共享字段与工具逻辑
用 protected 修饰的成员变量和方法,让子类安全访问共用资源,避免各自维护一套计数器、配置或校验逻辑。
- 在抽象类中定义 protected int idCounter = 0; 和 protected int nextId() { return ++idCounter; }
- 每个子类创建实例时调用 nextId() 就能拿到全局递增 ID,无需复制粘贴相同逻辑
- 类似地,可封装通用的日志记录、JSON 序列化辅助、空值检查等工具方法
利用构造器执行公共初始化
抽象类的构造器虽不能直接 new,但子类实例化时一定会触发它,适合做统一前置准备。
- 比如在抽象类构造器中设置默认名称、加载配置文件、注册事件监听器、初始化线程池
- 所有子类自动获得这些初始化能力,不需要在每个子类构造器里重复写 loadConfig() 或 initLogger()
- 子类可通过 super(...) 显式传参,实现差异化初始化的同时保留公共步骤
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











