在访问带有类名的最终静态变量时,为什么不在java中处理静态块?
class Foo {
public static final int BAR;
static {
System.out.println("Hello");
}
}
class Baz {
public static void quux() {
System.out.println(Foo.BAR);
}
}
答案 0 :(得分:11)
有时候 - 这取决于变量实际上是常量:
如果是这种情况,对变量的任何引用都会有效地转换为值。所以在这段代码中:
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
不算作常量。
答案 1 :(得分:0)
仅在加载类时才执行静态块。在以下情况下将完成此操作:
如果在运行时手动加载类
Ex:使用Class.forName(“ Foo”))