有没有理由在静态块之前不会实例化静态最终变量?
所以在我提供的例子中将打印:
someVar value= null
而不是:
someVar value=SomeValue
我今天看到了这种行为,在我的申请中,
我试图重现 - 不成功 - 我确实看到了静态成员的价值......
class SomeClass{
static final String someVar ="SomeValue";
static{
System.out.println("someVar value=" + someVar );
}
public static void main(String[] args){
new SomeClass();
}
}
答案 0 :(得分:2)
初始化顺序在JSL #12.4.2:
中给出对于静态初始化:
施工:
评估参数并递归处理超类构造函数调用
为此类执行实例初始值设定项和实例变量初始值设定项,将实例变量初始值设定项的值按从左到右的顺序分配给相应的实例变量,在这些顺序中它们以文本方式出现在源代码中类。
执行此构造函数的其余部分。
请注意,初始化程序块和变量初始值设定项一起考虑,而不是单独考虑。
答案 1 :(得分:0)
我想说,这取决于你的代码序列。在您的本地运行以下代码,它会告诉您答案。
public class SomeClass{
static final String someVar ="SomeValue";
static final StaticMember staticMem = new StaticMember(1);
static{
System.out.println("someVar value=" + someVar );
}
static final StaticMember staticMem2 = new StaticMember(2);
public static void main(String[] args){
new SomeClass();
}
}
class StaticMember {
StaticMember(int num) {
System.out.println("StaticMember constructor " + num);
}
}
答案 2 :(得分:0)
jvm会有一个命令,并且始终处于优先级:
如果你有继承,那么实例化顺序会有所不同:
我希望这能澄清你的问题。