抽象类可定义带实现的普通方法,如breath()、sleep()等,子类直接调用或通过super显式调用;配合抽象方法构成模板方法模式,统一主干流程并定制关键环节;还可封装工具逻辑、共享状态及构造器初始化。

在抽象类中编写带实现的普通方法,就是像写普通类一样定义方法,不加 abstract 关键字,直接提供方法体(即大括号 {} 和具体逻辑)。
普通方法可以直接定义和调用
抽象类允许同时包含抽象方法和非抽象方法。只要方法不是 abstract 的,它就自动具备完整实现,子类继承后可直接使用,无需重写。
- 例如:
breath()、sleep()、getName()这类通用行为,适合放在抽象类里一次性写好 - 子类创建实例后,能立即调用这些方法:
dog.sleep(); - 子类内部也可通过
super.sleep()显式调用父类实现,并在其基础上扩展逻辑
配合抽象方法构成模板结构
把固定流程写成具体方法,把变化点留作 abstract 方法,是常见且实用的设计方式。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 比如定义一个
performDailyRoutine():先调用wakeUp()(已实现),再调用makeSound()(抽象),最后调用sleep()(已实现) - 这样所有子类都走统一主干流程,只定制关键环节,既保证一致性,又保留灵活性
封装工具逻辑与共享状态
抽象类可以定义 protected 字段或工具方法,供子类复用,避免重复编码。
立即学习“Java免费学习笔记(深入)”;
- 如声明
protected int idCounter = 0;,并提供protected int nextId() { return ++idCounter; } - 子类构造时调用
nextId()即可获得唯一编号,无需各自维护计数器 - 日志输出、参数校验、资源初始化等共性逻辑,也适合放在这里
构造器中执行公共初始化
抽象类可以有构造方法,用于设置默认值、加载配置或验证参数——虽然不能直接 new,但子类构造时会自动触发父类构造逻辑。
- 例如:
public Animal(String name) { this.name = name != null ? name : "anonymous"; } - 子类构造器第一行必须写
super(...),确保该初始化被执行

















