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

问题描述 投票:1回答:1

举个例子

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 draft关于类的懒惰,但它是一个记录的界面功能?或者只是JVM实现的细节?

java static lazy-initialization
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.