抽象类构造方法在子类实例化时被优先调用,依靠Java构造链强制机制:子类构造器第一行必须显式或隐式调用super(),触发向上逐层初始化;即使父类为abstract,该规则仍生效,确保protected字段赋值、参数校验等初始化逻辑在子类自身构造体执行前完成。

抽象类的构造方法在子类实例化时被优先调用,靠的是 Java 构造链的强制机制:子类构造器第一行必须调用父类构造器(显式 super(...) 或隐式 super()),而这个调用会向上逐层触发,直到最顶层父类。抽象类虽不能 new,但只要它在继承链中,它的构造方法就必然参与这一初始化流程。
构造链是编译器强制执行的顺序规则
Java 规定,每个子类构造器在执行自身逻辑前,必须完成父类状态的初始化。这并非可选行为,而是编译期检查:
- 若子类构造器未显式写
super(...),编译器自动插入super()(调用父类无参构造) - 若抽象父类只提供有参构造(如
Animal(String name)),子类就必须显式写super(name),否则编译失败 - 哪怕父类是
abstract,这条规则照常生效——JVM 不区分“抽象”或“具体”,只认继承关系和构造签名
执行时机严格固定在子类构造体之前
以 new Dog("旺财") 为例,实际执行顺序如下:
- JVM 先为
Dog对象分配内存,字段设默认值(null、0等) - 进入
Dog构造器,第一行(显式或隐式)跳转到Animal(String) -
Animal构造体执行:赋值this.name = "旺财"、打印日志、做校验等 - 返回后,才继续执行
Dog自己的构造体内容
抽象类构造方法能做的事,和普通类完全一样
它不是摆设,而是承担真实职责的初始化入口:
- 接收参数,初始化
protected字段(如id、name) - 执行非空校验、范围检查、格式预处理等共用逻辑
- 加载内部缓存、注册监听器、打开资源句柄(需配合
try-with-resources或后续清理) - 避免子类重复写相同校验代码,也防止用实例块或 setter 替代导致的时机错乱
注意:静态块和实例块不替代构造方法
它们各有分工,不能混淆:
- 静态块只在类加载时执行一次,无法响应每次
new的不同参数 - 实例初始化块(
{ ... })虽每次执行,但不接受参数,只能设固定默认值 - 只有构造方法支持带参调用,是唯一能把子类传入的具体值传递给父类字段的通道
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











