gpt4 book ai didi

java - 在 Java 中访问未初始化的静态字段

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:14 26 4
gpt4 key购买 nike

我很感激this answer为了这个想法。

下面的代码编译,但肯定不应该。它在初始化之前使用 x 的值。如果删除 StaticAssign. 限定符,它将不再编译。

public class StaticAssign {

public static final int x;

static {
System.out.println(StaticAssign.x);
x = 5;
}

public static void main(String[] args) {}

}

在我的机器上,这始终打印 0。如果我将 x 的类型更改为 String,它会始终打印 null

问题是:它肯定会打印 0null,还是它可能会访问未初始化的内存并打印出其他内容?

即使这段代码通过了编译器,为什么 JVM 不接收它?

有没有办法基于此做一些令人讨厌的事情?

最佳答案

它实际上已经被初始化了。全局范围内的变量会自动初始化。 Object 类型的变量将被初始化为 null 原语,如 int 将被初始化为 0。必须初始化不在全局范围内声明的变量,即。在方法中声明。另一个问题是将它声明为 final 这告诉编译器它必须被显式初始化。因此,通过添加 x=5,您可以绕过编译器错误,指出它必须显式初始化。当您在运行时在此行之前访问它时,它会像全局范围内的任何其他原始 int 类型变量一样被初始化为 0。

关于java - 在 Java 中访问未初始化的静态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27507008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com