抽象类的构造函数一定会被执行,因为子类实例化时必须完成整个继承链的初始化;即使抽象类不能直接实例化,其构造函数仍参与super()调用链,且执行顺序严格遵循从object到子类的自顶向下规则。

抽象类写构造函数,对子类实例化时 super() 的调用顺序没有特殊改变——它完全遵循 Java 普通继承的初始化规则:父类构造必须先于子类执行,且抽象类的构造函数一定会被调用。
抽象类的构造函数会被执行吗?
会,而且必然执行。抽象类虽不能直接 new 实例,但它是子类的直接父类,子类对象内存中包含抽象父类定义的字段和初始化逻辑,JVM 要求其构造函数必须参与初始化链。
- 抽象类哪怕没显式写构造器,编译器也会生成一个默认无参构造(public 或包访问)
- 只要抽象类显式定义了构造函数(无论有参、private、protected),子类就必须匹配调用
- 若抽象父类只提供 private 构造器,子类无法访问,编译失败;若为 protected,子类可正常 super() 调用
super() 调用位置和合法性规则不变
子类构造器第一行仍必须是 super() 或 this(),且二者互斥。抽象类的存在不豁免该语法约束。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 子类没写 super() → 编译器尝试插入 super(),仅当抽象父类存在可访问的无参构造时成功
- 抽象父类只有带参构造(如 protected Animal(String name))→ 子类必须显式写 super("Lion"),否则编译报错:“Implicit super constructor is undefined”
- super() 参数必须严格匹配抽象父类中可访问构造器的签名(类型、个数、顺序)
完整执行顺序(以 new ConcreteChild() 为例)
从 Object 开始,沿继承链自顶向下,每层完成自己的实例初始化:
- 加载阶段:抽象父类静态变量 → 抽象父类静态块 → 子类静态变量 → 子类静态块
- 实例化阶段:
- 抽象父类实例变量赋值 → 抽象父类实例块 → 抽象父类构造函数体
- 子类实例变量赋值 → 子类实例块 → 子类构造函数体
注意:抽象父类的实例块和构造函数体,都在子类任何代码执行前完成;即便抽象类中构造器调用了被子类重写的方法,此时子类字段仍为默认值(null/0),需谨慎设计。
常见误区提醒
“抽象类不能实例化,所以它的构造器不会运行”——这是错的。子类对象创建时,抽象父类部分必须初始化,它的构造器就是初始化入口,不是摆设。
- 抽象类构造器可以含业务逻辑:校验参数、初始化 final 字段、抛异常阻止非法子类构造
- 不能在 super() 前使用 this.xxx 或调用非静态方法,因为 this 尚未通过父类构造激活
- 如果抽象类继承自普通类(如 extends Base),则 Base 的构造器会在抽象父类构造器之前执行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










