gpt4 book ai didi

java - 最终变量首先初始化

转载 作者:搜寻专家 更新时间:2023-11-01 02:35:19 25 4
gpt4 key购买 nike

我在这里阅读问题:Java : in what order are static final fields initialized?

根据回答

"except that final class variables and fields of interfaces whose values are compile-time constants are initialized first ..."

我认为这是不正确的,因为以下将失败:

static {
String y = x;
}

public static final String x = "test";

在静态 block 中,x 不被识别。如果答案正确,任何人都可以发表评论吗?

最佳答案

初始化 的顺序不会改变 JLS 不允许您在各种情况下声明变量之前引用变量的事实。这在 JLS§8.3.3 中有描述。 :

Use of class variables whose declarations appear textually after the use is sometimes restricted, even though these class variables are in scope (§6.3). Specifically, it is a compile-time error if all of the following are true:

  • The declaration of a class variable in a class or interface C appears textually after a use of the class variable;

  • The use is a simple name in either a class variable initializer of C or a static initializer of C;

  • The use is not on the left hand side of an assignment;

  • C is the innermost class or interface enclosing the use.

这就是为什么您的代码会出现此编译错误:

error: illegal forward reference

作为常量变量的静态字段先初始化的说法确实定义在JLS§12.4.2中:

  1. Otherwise, record the fact that initialization of the Class object for C is in progress by the current thread, and release LC.

    Then, initialize the static fields of C which are constant variables (§4.12.4, §8.3.2, §9.3.1).

...

  1. Next, execute either the class variable initializers and static initializers of the class, or the field initializers of the interface, in textual order, as though they were a single block.

如您所见,常量变量在第 6 步中初始化,而其他变量在第 9 步中初始化。

这演示了行为:

public class Example {
static String y;
static {
y = foo();
}

static String foo() {
return x.toUpperCase();
}

public static final String x = "test";

public static void main(String[] args) throws Exception {
System.out.println(x);
System.out.println(y);
}
}

编译并输出:

testTEST

In contast, if you change the x line so it's not constant anymore:

public static final String x = Math.random() < 0.5 ? "test" : "ing";

它编译,但随后失败,因为从 y = foo(); 开始,xnull


为避免疑义:我建议使用方法来初始化这样的字段。 :-)

关于java - 最终变量首先初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57168984/

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