java - 执行顺序,静态 block

标签 java

我有以下场景 包 com.example.test;

public class StaticTest {

    public static final String STATIC_VAR="Static Var";

    static{
        System.out.println("Static Block Called....");
    }
public static void init(){}
}

package com.example.test;

public class MainClass {
    public static void main(String[] args) {
        System.out.println("Test static initialization");
        String staticvar =StaticTest.STATIC_VAR;
        System.out.println("Referred static variable--> "+ staticvar);
        System.out.println("Calling static method");
        StaticTest.init();
        System.out.println("Static method invoked");
    }

}

我得到的输出是

Test static initialization
Referred static variable--> Static Var
Calling static method
**Static Block Called....**
Static method invoked

我期待的输出是

Test static initialization
**Static Block Called....**
Referred static variable--> Static Var
Calling static method
Static method invoked

我在想,只要我引用静态变量,静态 block 就会被执行。

有什么解释吗?

最佳答案

因为变量是public static final,所以它被编译器内联了。

所有对它的引用都被替换为实际值,因为它不能改变,这被称为编译时间常量。

您的代码实际上被编译为:

System.out.println("Test static initialization");
String staticvar = "Static Var";

如果将值赋给方法的返回值——

public static final String STATIC_VAR=getStaticVar();
private static String getStaticVar() {
    return "Static Var";
}

你会得到你期望的结果。

有一个good SO answer解释内联和 JLS 对编译时间常量的保证。

关于java - 执行顺序,静态 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15965883/

相关文章:

java - 在 list 和运行时允许读写权限后权限被拒绝

java - 如何读取旧的word doc文件元数据

java - 从一个txt文件导入数据到android数据库

java - 正则表达式匹配大写字符、数字和句点

java - 对象数组,Java和C++的区别

java - 为九个按钮编写 for 循环

java - TreeMap: NavigableMap<K,V> subMap(),它是否创建了新的 map 对象?

java - Hibernate列表操作问题

java - Spring boot - 在 @Qualifier 上使用可配置值

java - 将具体对象列表转换为抽象类型