You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java静态成员执行顺序疑问:为何静态代码块额外输出内容?

为什么我的Java程序输出多了"inside the block"?

先还原下你的问题:你运行了这段Java代码,预期输出里没有inside the block,但实际却打印了这一行,疑惑为什么会这样对吧?

你之前的理解误区在于:Java程序并不是直接从main方法开始执行的——在JVM调用main方法之前,它会先完成整个类的初始化流程,这就是你看到额外输出的原因。我结合你划分的section给你拆解下完整的执行顺序:

  1. 第一步:执行静态变量初始化(section 01)
    当JVM加载Example3类时,首先会处理静态成员的初始化。这里static int a = checker();会直接调用checker()方法(section 03),所以先打印from checker,同时a被赋值为20。

  2. 第二步:执行静态代码块(section 02)
    静态变量初始化完成后,JVM会接着执行类里的静态代码块,也就是这段:

    static{ 
        System.out.println("inside the block"); 
    }
    

    所以这时候会打印inside the block

  3. 第三步:进入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

火山引擎 最新活动