抽象类可定义构造方法但不能直接实例化,其构造方法在子类创建对象时被调用,用于初始化父类字段和执行公共逻辑;语法与普通类一致,推荐用protected修饰,不可private;若只有带参构造,子类须显式调用super(...);构造中可赋值final字段、校验参数,但不可调用抽象方法。

抽象类可以定义构造方法,但不能直接实例化;它的构造方法只在子类创建对象时被调用,用于统一初始化父类字段和执行公共逻辑。
构造方法的写法和访问修饰符
抽象类的构造方法语法与普通类完全一致,可重载多个、支持任意参数列表。访问修饰符推荐使用 protected——既能被子类调用,又避免被无关类误用;不可用 private,否则子类无法访问。
- 可以有无参构造,也可以只有带参构造
- 若只提供带参构造,子类必须显式调用
super(...),否则编译失败 - 构造方法中可对
final字段赋值、校验参数、设置默认状态
子类如何正确调用抽象父类构造方法
Java 要求子类构造器第一行必须调用父类构造器。这个规则对抽象类同样适用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 若抽象类有无参构造,子类可不写
super(),编译器自动插入 - 若抽象类没有无参构造,子类必须在第一行显式写出匹配的
super(参数) -
super()必须是子类构造器的第一条语句,不能和this()混用
构造方法的核心作用
抽象类构造方法不是为自身服务,而是为所有子类提供安全、可控的初始化入口:
- 初始化
protected或包级私有字段(如name、timeout) - 封装通用校验逻辑(如非空检查、范围判断),避免子类遗漏
- 准备共享资源(如日志器、配置对象、线程池引用)
- 注意:构造方法中 不能调用抽象方法,否则可能引发未定义行为
典型写法示例
结合 final 字段与带参构造,保障关键状态不可绕过、一次性初始化:
protected final String name;
protected final int timeoutMs;
protected DataProcessor(String name, int timeoutMs) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("name must not be blank");
}
if (timeoutMs throw new IllegalArgumentException("timeoutMs must be > 0");
}
this.name = name.trim();
this.timeoutMs = timeoutMs;
}
public abstract void process();
}
子类只需传递必要参数,无需重复校验或初始化公共字段。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










