我找不到任何具体的,所以在帖子中提到了这个具体的案例,所以我想问一下,我认为什么是“是/否”的问题。
下面是JLS§12.4.2 (Java 8),清单6-7:
我的问题是:它是否意味着子类的最终静态变量是在超类的静态初始化之前初始化的(假设最终的静态变量是作为声明的一部分初始化的)?
发布于 2016-08-23 22:10:29
答案可能是这样的。关键部分是一个常量词的意思。
考虑一下这段代码
class Foo {
public static final int FOO_VALUE = 1000;
static {
System.err.println("FOO Bar.BAR_VALUE=" + Bar.BAR_VALUE);
}
}
class Bar extends Foo {
public static final int BAR_VALUE = 2000;
static {
System.err.println("BAR Foo.FOO_VALUE=" + Foo.FOO_VALUE);
}
}这个程序的输出将是
FOO Bar.BAR_VALUE=2000
BAR Foo.FOO_VALUE=1000在这种情况下,Bar静态最终变量在Foo静态初始化之前被初始化。FOO_VALUE和BAR_VALUE都是常量,因此javac可以内联这个字段。
但是,您可以通过这样假装最终变量不是常量来欺骗编译器。
class Foo {
public static final int FOO_VALUE = Integer.valueOf(1000).intValue();
static {
System.err.println("FOO " + Bar.BAR_VALUE);
}
}
class Bar extends Foo {
public static final int BAR_VALUE = Integer.valueOf(2000).intValue();
static {
System.err.println("BAR " + Foo.FOO_VALUE);
}
}输出将是
FOO Bar.BAR_VALUE=0
BAR Foo.FOO_VALUE=1000因此,Foo静态初始化器是在静态最终Bar.BAR_VALUE被初始化之前完成的。
https://stackoverflow.com/questions/39111345
复制相似问题