抽象类通过protected字段、构造器初始化和final修饰实现子类共享状态的受控复用:protected字段供子类直接访问,构造器强制传参并校验,final字段保障不可变性,避免public或static字段破坏封装与线程安全。

Java 抽象类通过定义 protected 或 package-private 成员变量 来保存子类共享的公共状态,这些字段在子类中可直接访问或由父类构造器统一初始化,从而实现状态复用与封装控制。
用 protected 字段保存可继承的公共状态
抽象类可以声明 protected 实例变量,子类能直接读写,又避免了 public 字段破坏封装的风险。这是保存“子类共用但需受控访问”的状态最常用方式。
- 例如动物类中统一管理名称和年龄:
protected String name;protected int age; - 子类构造时可通过
super(name, age)触发抽象父类构造器完成初始化 - 不建议用
public字段——子类随意修改可能破坏父类逻辑不变量
通过构造器集中初始化公共状态
抽象类可定义带参构造方法,强制子类在创建对象时传入必要状态值,确保所有子类实例都具备一致的基础数据。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 抽象类构造器不能被直接调用,但子类构造器必须显式或隐式调用
super(...) - 可在构造器中做参数校验(如
Objects.requireNonNull(name)),保障状态合法性 - 避免在抽象类中使用无参构造器初始化默认值,除非该默认值对所有子类都合理且稳定
用 final 字段保证不可变公共状态
若某项状态一旦设定就不应更改(如资源标识、配置类型),可用 final protected 字段声明,并在构造器中赋值。
- 例如:
protected final String category = "MAMMAL"; - 既向子类公开,又防止运行时误修改,增强安全性与可读性
- 比 static final 常量更灵活——每个实例可有独立值(如不同子类传入不同 category)
避免用 static 字段模拟“公共状态”
静态字段属于类而非实例,所有子类对象共享同一份数据,容易引发状态污染和线程安全问题。
- 除非明确需要全局共享(如计数器、缓存容器),否则不要用
static存储本该按实例隔离的状态 - 若真需跨实例共享,应单独抽取为工具类或服务类,而非塞进抽象类
- 抽象类的核心价值是为 每个子类实例 提供可继承、可定制的状态结构,不是做全局变量容器
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










