创建子类对象时,构造函数按继承链从上到下执行:先父类,再子类;父类构造函数一定先于子类构造函数执行,每个子类构造函数第一行默认或显式调用super()(或this()),JVM由此确保父类构造逻辑先行完成。

创建子类对象时,构造函数按继承链从上到下执行:先父类,再子类。
父类构造函数一定先于子类构造函数执行
每个子类构造函数第一行默认或显式调用 super()(或 this()),JVM 由此确保父类构造逻辑先行完成。即使子类构造函数体为空,父类构造函数也会被调用。
- 若父类只有带参构造函数,子类必须用 super(…) 显式调用,否则编译失败
- 多层继承(如 A → B → C)中,顺序是 A() → B() → C(),逐级向下
- 父类构造函数执行完毕后,才会进入子类构造函数体
构造函数不是初始化的起点,而是链中一环
构造函数体内的代码,只是整个实例初始化流程的最后一步(针对当前类)。在它之前,JVM 已完成:
- 父类实例变量显式赋值(如 String name = "Tom";)
- 父类实例代码块({ … })
- 父类构造函数体
- 子类实例变量显式赋值
- 子类实例代码块
之后才真正执行子类构造函数体中的语句。
立即学习“Java免费学习笔记(深入)”;
静态部分和实例部分严格分离
构造函数属于实例阶段,与静态代码块无关。静态代码块只在类首次加载时执行一次,顺序是父类静态块 → 子类静态块;而构造函数每次 new 都执行,且始终遵循“先父后子”。
- 先 new 父类对象,再 new 子类对象:父类静态块只执行一次,子类静态块在其首次使用时触发
- 后续多次 new 子类对象:静态块不再运行,但每次都会完整走一遍父→子构造流程
注意字段初始化与方法重写的陷阱
在父类构造函数中调用可被子类重写的方法,实际执行的是子类版本——但此时子类字段尚未初始化,可能仍为默认值(如 null 或 0)。
- 例如父类构造器里调用 init(),而子类重写了它,子类的 init() 会运行,但其 own field 可能还是默认值
- 避免在构造函数中调用非 final 方法,防止访问未初始化的子类状态


















