首页 > 解决方案 > 为什么调用静态最终变量时不先执行静态块

问题描述

class Test4 {
     public static void main(String as[]) {
         System.out.println(Hello.x); 
     }

}

class Hello {
    final static int x=10;
    static {
        System.out.println("Hello");                
    }
}

输出:10

Hello如果我们调用静态变量然后加载第一个类,并且当加载类然后首先它应该执行静态块然后将发送静态变量,为什么它不打印根据我的知识。

标签: java

解决方案


静态初始化程序块在包含它的类被初始化时执行——这通常是在加载类时。

你会说当你在 class 中访问时,JVM 应该加载和初始化Helloclass 。但是,这里不会发生这种情况,因为这是一种特殊情况。Hello.xTest4

static final常量由编译器内联 - 这意味着当编译此代码时,Hello.x方法main中的 将在编译时替换为常量的值,即10. 本质上,您的代码编译为与编译时相同的字节码:

class Test4 {
    public static void main(String[] args) {
        System.out.println(10); // Inlined constant value here!
    }
}

class Hello {
    final static int x = 10;
    static {
        System.out.println("Hello");                
    }
}

请注意,在这种情况下,类Test4并没有真正访问类——因此在运行时不会加载类并且不会执行静态初始化程序。HelloHelloTest4


推荐阅读