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

标签 java jvm javac static-members undefined-behavior

我很感激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/

相关文章:

java - 如何使用 Java 从 Windchill 检索部件/BOM?

arrays - 如何从 Kotlin JVM 的字节数组中获取无符号整数?

java - 每个 Java 应用程序是否有一个 JVM?

javac:包 org.apache.derby.client.am 不存在

java - 默认PreparedStatement不可序列化

java - BufferedReader 第二次使用返回 null

java - 顺序异步任务,其中每个后续使用都来自前一个

java - 为什么选择 SerialGC 而不是 G1GC?

java - 在 Java 注释处理器中获取环境变量

java - 在windows 8命令行上编译Junit报错