Java静态成员执行顺序疑问:为何静态代码块额外输出内容?
先还原下你的问题:你运行了这段Java代码,预期输出里没有inside the block,但实际却打印了这一行,疑惑为什么会这样对吧?
你之前的理解误区在于:Java程序并不是直接从main方法开始执行的——在JVM调用main方法之前,它会先完成整个类的初始化流程,这就是你看到额外输出的原因。我结合你划分的section给你拆解下完整的执行顺序:
第一步:执行静态变量初始化(section 01)
当JVM加载Example3类时,首先会处理静态成员的初始化。这里static int a = checker();会直接调用checker()方法(section 03),所以先打印from checker,同时a被赋值为20。第二步:执行静态代码块(section 02)
静态变量初始化完成后,JVM会接着执行类里的静态代码块,也就是这段:static{ System.out.println("inside the block"); }所以这时候会打印
inside the block。第三步:进入main方法(section 04)
只有当类的所有静态初始化工作都完成后,JVM才会调用main方法。这时候执行System.out.println(a);会打印20,然后执行System.out.println("from main");打印对应的内容。
这样整个流程下来,实际输出就是:
from checker inside the block 20 from main
你之前误以为main方法里的System.out.println(a);才触发a的初始化,但实际上静态成员和静态代码块的初始化都是在main方法执行前就完成的,这就是你没预料到inside the block输出的核心原因。
内容的提问来源于stack exchange,提问作者Hilton




