在我们的团队中,我们发现在使用static和final限定词时都有一些奇怪的行为。这是我们的测试课程:
static
final
public class Test { public static final Test me = new Test(); public static final Integer I = 4; public static final String S = "abc"; public Test() { System.out.println(I); System.out.println(S); } public static Test getInstance() { return me; } public static void main(String[] args) { Test.getInstance(); } }
运行该main方法时,将得到以下结果:
main
null abc
我会理解它是否null两次都写值,因为静态类成员的代码是从上到下执行的。
null
谁能解释为什么这种现象发生?
这些是您运行程序时采取的步骤:
Test
me
new Test()
I
Integer
4
Integer.valueOf(4)
S
abc
课程:如果您依赖急切初始化的静态单例,请将单例声明放置为最后一个静态字段声明,或者诉诸于在所有其他静态声明之后出现的静态初始化程序块。这将使该类看起来完全初始化为单例的构造代码。