抽象类可以定义构造函数,且必须通过子类实例化时调用;其写法与普通类一致,支持参数、修饰符和逻辑体,用于初始化继承字段、校验参数及预加载资源,子类须显式或隐式通过super()调用,否则编译失败。

抽象类可以定义构造函数,且必须通过子类实例化时调用——这是完成初始化逻辑的关键机制。
抽象类的构造函数可以有参数和逻辑
抽象类的构造函数写法与普通类完全一致,支持访问修饰符(public、protected、包级)、参数列表和方法体。它不会被直接调用,但会在子类构造过程中自动触发(隐式或显式调用)。
- 若抽象类没有显式定义构造函数,编译器会提供一个无参默认构造函数
- 若定义了带参构造函数,又没写无参构造,则子类 必须显式调用 super(...),否则编译失败
- 构造函数中可执行字段赋值、资源预加载、状态校验等初始化操作
子类必须调用抽象父类的构造函数
Java 规定:每个子类构造函数的第一条语句,必须是 this(...) 或 super(...)(显式或隐式)。如果抽象父类只有带参构造函数,子类就必须显式调用 super(…)。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
例如:
立即学习“Java免费学习笔记(深入)”;
abstract class Animal {protected String name;
protected int age;
public Animal(String name, int age) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("Name cannot be blank");
}
this.name = name;
this.age = age;
}
}
class Dog extends Animal {
public Dog(String name, int age) {
super(name, age); // 必须显式调用
}
}
常见初始化场景与建议
- 初始化 final 字段:抽象类中声明的 final 成员变量,只能在构造函数中赋值
- 统一前置校验:如参数合法性检查、依赖对象非空判断,避免在每个子类中重复写
- 设置默认状态:比如初始化集合、配置标志位、注册监听器等共性行为
- 不建议在构造函数中调用可重写的方法:子类方法可能在对象未完全构造时被调用,导致未定义行为
构造函数不是唯一初始化入口,但最可靠
虽然静态代码块、实例代码块、@PostConstruct(Spring)也能做初始化,但抽象类的构造函数是每次实例化都必经、且面向对象语义最清晰的初始化时机。它天然保证:只要子类对象创建成功,父类的初始化逻辑就已执行完毕。

















