Java接口(interface)静态字段延迟初始化

标签 java static lazy-initialization

给出的例子

interface A {
    static int aInit() {
        System.out.println("Interface field");
        return 42;
    }
    int a = aInit();
}

class B implements A {
    static int bInit() {
        System.out.println("Class field");
        return 42;
    }
    static final int b = bInit();
}

A a = new B();

在 JDK8 和 JDK10 上仅打印 “Class field”。直接访问 A.a 会生成其初始化和“接口(interface)字段” 输出。

这表明接口(interface)静态字段初始化是惰性的,而对于最终静态类字段则不然。

我可以看到OpenJDK JEP draft关于类的这种懒惰,但是它是接口(interface)的记录功能吗?或者只是 JVM 实现的细节?

最佳答案

这是一种记录在案的行为。接口(interface) A 将不会按照 https://docs.oracle.com/javase/specs/jls/se12/html/jls-12.html#jls-12.4.1 进行初始化。仅当调用字段 a 或方法 aInit() 时,它才会被初始化。

关于Java接口(interface)静态字段延迟初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55399813/

相关文章:

java - StringBuilder.insert() 不改变输出

java - 如果它不能为空,但需要初始化,我该怎么办?

c# - 静态只读变量初始化

c++ - 函数作用域静态对象的构造函数抛出异常

java - 在没有静态嵌套类的情况下按需初始化多个静态变量?

java - 为什么我的 GUI 看起来总是不正确?

java - Android - JSON - 如何使用 JSONObject 和 JSONArray 类型创建 JSON 对象和 JSON 数组以匹配此格式?

Python - 获取静态信息

scala - 是否可以在 Scala 中的赋值/初始化之前声明一个 val?

java - 惰性集合初始化在 hibernate 中失败