抽象类通过protected/final字段统一管理公共属性,并在构造器中完成校验、赋值与依赖初始化,子类仅需传参并实现核心逻辑,配合模板方法复用行为流程。

抽象类通过定义共享字段、提供带参构造器,并强制子类在初始化时传入必要参数,就能为所有子类统一管理公共属性。
用 protected 或 final 字段声明公共属性
抽象类中声明的字段(如 name、timeoutMs、logger)会被所有子类继承并直接使用。推荐用 protected 保证子类可访问,用 final 防止后续被意外修改,确保初始化完整性。
- 避免 public 字段——破坏封装,子类可能随意改写
- 不建议 private 字段+getter——增加冗余,且无法在子类构造中直接参与初始化
- 常见公共属性包括:业务标识名、超时配置、日志实例、重试次数、基础客户端等
在抽象构造器中完成统一初始化
子类创建对象时,必须调用抽象父类的构造器(显式或隐式 super()),这就成了唯一入口。所有校验、赋值、依赖构建都集中在这里执行。
- 参数校验(如 name 非空、timeoutMs > 0)提前拦截非法状态
- 默认值设定(如 status = "INIT"、retryCount = 3)减少子类重复代码
- 依赖初始化(如 logger = LoggerFactory.getLogger(getClass()))利用运行时真实类型
- 注意:不能在构造器里调用 abstract 方法——子类实例尚未构建完成,易出空指针
子类只需专注差异化逻辑
子类构造器只负责把必要参数传给父类,不再重复校验或初始化公共部分,结构干净,不易出错。
立即学习“Java免费学习笔记(深入)”;
- 例如:new OrderProcessor("order", 5000) → 自动完成 name 校验、timeout 赋值、logger 创建
- 子类可额外定义自己的字段(如 orderIdPattern),与父类字段天然隔离
- 若需扩展初始化行为,可通过模板方法(如 initExtra())留钩子,而非绕过父类构造
配合模板方法强化流程控制
光有字段还不够,抽象类可把“使用公共属性”的固定流程也封装起来,比如执行前检查、日志记录、异常包装等。
- 定义 final 方法 execute(),内部调用 preCheck() → doBiz() → postHandle()
- preCheck() 和 postHandle() 设为 default 实现,子类按需重写
- doBiz() 声明为 abstract,强制子类实现核心逻辑,自然用到父类的公共属性
- 这样既复用属性,又复用基于这些属性的行为逻辑


















