Java代码执行顺序由类加载机制和运行时上下文共同决定:static块在类首次加载时按源码顺序执行一次;实例块和字段初始化在每次new时、构造器体前执行;构造器体最后执行,且父类先于子类;main方法是入口点而非起点,其前静态初始化若失败则main不运行;方法内语句按序执行但受控制流、短路运算、JIT重排序及finally语义影响。

Java代码执行顺序由类加载机制和运行时上下文共同决定,不是简单从上到下逐行跑完就结束的。
静态块、实例块、构造器的触发时机
它们的执行顺序固定,但只在特定对象生命周期阶段触发:
-
static块在类首次被加载(ClassLoader.loadClass)时执行,且仅一次 - 实例初始化块(非
static)和字段初始化,在每次调用new时、构造器体执行前运行 - 构造器体本身是最后执行的部分;若存在继承,父类构造器先于子类构造器调用
示例中即使写了多个 static 块,也按源码出现顺序合并执行;而实例块会随每个对象创建重复执行。
main 方法不是程序起点,而是入口点
真正起点是 JVM 加载 Main 类的过程。这意味着:
立即学习“Java免费学习笔记(深入)”;
- 如果
Main类有static字段或块,它们会在main执行前完成初始化 - 若
static初始化抛出异常(如ExceptionInInitializerError),main根本不会运行 - JVM 不要求
main是第一个方法——它只是通过字节码签名(public static void main(String[]))识别的约定入口
方法内语句按书写顺序执行,但受控制流影响
看似线性的代码可能因以下原因跳过或重排:
-
return、throw、break等提前终止当前流程 - 短路运算符(
&&、||)导致右侧表达式不执行 - JIT 编译器可能对无副作用的语句做重排序(不影响单线程语义,但影响多线程可见性)
-
try-catch-finally中,finally总会执行(除非System.exit()或 JVM 崩溃)
最常被忽略的是:类加载阶段的副作用(比如静态字段依赖外部资源)可能在你完全没意识到的时候就发生了,而且失败后没有回退机制。






