是的,父类构造器一定会被执行。JVM强制按继承链自顶向下顺序调用,从Object开始逐级执行父类构造器,最后执行子类构造器,且super()必须首行调用以确保父类部分先完成初始化。

子类对象实例化时,父类构造器一定会被执行,且严格按继承链自顶向下顺序触发:从 Object 开始,逐级调用父类构造器,最后执行子类构造器。这不是可选行为,而是 JVM 的硬性规则——编译器会在每个子类构造器首行自动插入 super()(若父类有无参构造器),否则必须显式写出 super(...)。
父类构造器是否总被调用?
是的,只要父类存在可访问的构造器,JVM 就强制调用。即使子类构造器为空、没写 super(),编译器也会自动补上。若父类只有带参构造器而子类未显式调用 super(…),编译直接失败,报错:
Implicit super constructor XXX() is undefined. Must explicitly invoke another constructor.
执行顺序与初始化时机
每次 new 子类对象时,JVM 按以下固定顺序完成实例化:
- 分配内存,所有字段设默认值(如
int→0、Object→null) - 执行父类普通代码块(含父类成员变量显式初始化语句)
- 执行父类构造器体
- 执行子类普通代码块(含子类成员变量显式初始化语句)
- 执行子类构造器体
注意:字段声明处的初始化(如 String name = "Tom";)会被编译器“挪”进对应类的普通代码块中,因此一定在构造器体之前运行,但仍在父类初始化完成后才轮到子类部分。
super() 必须放在第一行的原因
这不是语法限制,而是安全机制。JVM 要求对象的父类部分必须完全初始化后,子类逻辑才能开始——否则子类方法(尤其是被重写的非 final 方法)可能在父类字段还未赋值时就被调用,读到 null 或 0 等默认值,引发空指针或逻辑错误。因此:
-
super()或this()必须是构造器第一条语句 -
this、instanceof、非静态方法调用等依赖实例状态的操作,一律禁止出现在super()前 - 如需预处理参数,可用静态方法封装后传入:
super(process(raw))
多层继承与常见陷阱
对于 A → B → C 的继承链,构造顺序恒为:A() → B() → C()。每层只执行自己那一级的构造逻辑,不跳过、不合并。
- 静态代码块只在类首次加载时执行一次,顺序是父类静态块 → 子类静态块;它和构造器无关
- 避免在父类构造器中调用可被子类重写的方法——此时子类字段尚未初始化,容易出错
- 父类构造器抛异常,整个实例化立即终止,子类构造器后续代码不会执行

















