父类静态变量最先初始化,子类成员变量最晚,父类构造方法居中;静态变量在类加载阶段按继承顺序执行,构造方法在对象实例化时才执行,属不同阶段。

父类静态变量最先初始化,子类成员变量最晚,父类构造方法居中——但要注意:父类构造方法不属于“类加载时”执行,它发生在对象实例化阶段,和静态变量不在同一时间点。
静态变量在类加载阶段就完成,且严格按继承顺序
父类静态变量和静态代码块属于类的<clinit></clinit>方法,在类首次被主动使用(如 new、调用静态方法)时触发。JVM 要求父类必须先完成初始化,才能初始化子类。所以:
- 父类静态变量 → 父类静态代码块(按源码从上到下)
- 子类静态变量 → 子类静态代码块(同样按书写顺序)
- 这个过程只发生一次,与是否创建对象无关
父类构造方法不参与“类加载时”的初始化
构造方法不是类加载的一部分,它属于对象创建流程。只有当执行 new Child() 时,才会启动实例化链条。此时:
- 先执行父类实例变量赋值和构造代码块(非静态块)
- 再进入父类构造方法体
- 注意:即使子类构造器第一行是
super(),父类的实例变量初始化也已在 super() 调用前完成
子类成员变量属于实例初始化环节,排在最后
子类的普通字段(非 static)、构造代码块,都在每次 new 对象时才执行,顺序固定为:
- 父类实例变量/构造块 → 父类构造方法体
- 子类实例变量/构造块 → 子类构造方法体
- 也就是说,子类成员变量的初始化,一定晚于父类静态变量、父类构造方法
一句话理清关键分界点
类加载时只做静态事(static 变量 + static 块),其余全是对象创建时的事。 所以“父类静态变量”属于加载期,“父类构造方法”和“子类成员变量”都属于实例期,后者天然晚于前者。










