gpt4 book ai didi

java - java中未处理的静态 block

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:13:52 26 4
gpt4 key购买 nike

在访问带有类名的最终静态变量时,为什么静态 block 没有在 java 中处理?

class Foo {
public static final int BAR;
static {
System.out.println("Hello");
}
}
class Baz {
public static void quux() {
System.out.println(Foo.BAR);
}
}

最佳答案

有时会 - 这取决于变量是否实际上是一个常量:

  • 它必须是字符串或原始变量(可能任何其他具有空值的类;我必须检查)
  • 初始化表达式必须是常量表达式

如果是这种情况,对变量的任何引用都会有效地转化为值。所以在这段代码中:

class Foo {
public static final int BAR = 5;
}

class Baz {
public static void quux() {
System.out.println(Foo.BAR);
}
}

Baz中的方法被编译成相同的代码:

public static void quux() {
System.out.println(5);
}

字节码中没有Foo.BAR的提示,因此在方法执行时不需要初始化Foo

如果你想防止这种情况发生,你总是只是让它不在变量初始化器中用常量表达式初始化。例如:

class Foo {
public static final int BAR;

static {
BAR = 5;
}
}

class Baz {
public static void quux() {
System.out.println(Foo.BAR);
}
}

就编译器而言,这足以使 Foo.BAR 不被视为常量。

关于java - java中未处理的静态 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15856355/

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