首页 > 解决方案 > Java接口静态字段延迟初始化

问题描述

给定示例

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 field"输出。

这表明接口静态字段初始化是惰性的,对于最终静态类字段而言并非如此。

我可以看到有关此类惰性的OpenJDK JEP 草案,但它是接口的文档功能吗?还是只是 JVM 实现的一个细节?

标签: javastaticlazy-initialization

解决方案


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


推荐阅读