【问题标题】:Why static block is not executed first when we call static final variable [duplicate]为什么当我们调用静态最终变量时不首先执行静态块[重复]
【发布时间】:2018-11-07 00:44:37
【问题描述】:
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


    【解决方案1】:

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

    当您访问类Test4 中的Hello.x 时,您会说JVM 应该加载并初始化类Hello。但是,这里不会发生这种情况,因为这是一种特殊情况。

    static final 常量由编译器内联——这意味着当编译这段代码时,main 方法中的Hello.x 在编译时被常量的值替换,即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 类并没有真正访问Hello 类 - 因此Hello 类没有加载,并且在您运行Test4 时不会执行静态初始化程序。

    【讨论】:

    • 类 Test4 { public static void main(String[] args) { System.out.println(10); // 这里内联常量值! } } 类你好 { final static int x;静态 { x=10; System.out.println("你好"); } }
    • a/c 你的概念,在这种情况下,编译器也会用 10 替换 Hello.x,结果是 10。但实际结果是 Hello 10
    • @DEEPAKKUMAR 您稍微修改了我的代码,因此我上面描述的内容不再适用。
    猜你喜欢
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    相关资源
    最近更新 更多