java - 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 实现的一个细节?
解决方案
这是记录在案的行为。该接口A
不会按照https://docs.oracle.com/javase/specs/jls/se12/html/jls-12.html#jls-12.4.1进行初始化。a
它仅在调用字段或方法时才被初始化aInit()
。
推荐阅读
- java - 如何使 ChipGroup 像 radioGroup 一样工作?
- python - Pywin32,用word在outlook写自定义邮件
- c++ - 查找包含指定单词的行(从文件中)
- azure - 无法在我的计算机上设置 azure data factory V2 自托管集成运行时
- ruby-on-rails - 当您使用 ActiveStorage 上传多个文件时,是否可以确定刚刚上传的内容?
- javascript - Rails 6 - Javascript:未捕获的 ReferenceError:未定义 Quill
- python - 如何在pytorch中进行批量填充
- delphi - delphi 从 TMemorystream 读取而不改变位置
- api - 我可以创建一个应用程序来询问用户的 gdrive id 和密码,然后自动将文件从本地计算机上传到 gdrive 吗?
- pyspark - 如何捕获未由 pyspark 函数转换的行?