gpt4 book ai didi

java - 为什么引用静态 final 字段不会触发类加载?

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

我有这样的测试代码:

public class Constants {
public static String c1 = "C1";

static {
System.out.println("Constants Class Loaded!");
}
}

public class Test {
public static void main(String[] args) {
String c1 = Constants.c1;
System.out.println(c1);
}
}

它的输出是:

Constants Class Loaded!
C1

因此,类 Constants 由 JVM 加载。但是如果我在类 Constants 中的静态字段中添加一个 final 关键字:

public class Constants {
public static final String c1 = "C1";

static {
System.out.println("Constants Class Loaded!");
}
}

它的输出变为:

C1

似乎没有加载类 Constants。

我的本​​地环境是:

OS: Win7 x64
JVM: JRockit (build R28.2.0-79-146777-1.6.0_29-20111005-1808-windows-ia32, compiled mode)

所以,我的问题是:

  • 为什么引用静态 final 字段不会触发类加载? JVM遇到这段代码会做什么(字节码)?
  • 此行为是否取决于特定的 JVM?或者这是 Java 语言规范中的规则?
  • 这样做的优点和缺点是什么?

谢谢。

最佳答案

Why reference to a static final field will not trigger class loading? What will JVM do(bytecode) when it meets this code?

The JLS says

A class or interface type T will be initialized immediately before the first occurrence of any one of the following:

  • [...]
  • A static field declared by T is used and the field is not a constant variable (§4.12.4).

A constant variable定义为

A constant variable is a final variable of primitive type or type String that is initialized with a constant expression (§15.28).

所以你的字段就是这样一个常量变量,访问它不会导致类型被初始化。

Is this behavior depending on specific JVM? Or this is a rule in Java language specification?

Java 语言规范指定了此行为。

What's the advantage & disadvantage of this?

缺点是它可能会引起困惑(如果您不了解 Java 语言规范的详细信息)。

优点是引用常量不会导致任何不必要的代码执行。

关于java - 为什么引用静态 final 字段不会触发类加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22650464/

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