我只花了五分钟在SO中找到一份副本。
我的问题很简单。以下代码是否始终有效?
public class LexicalOrderStatic {
private static Integer a1 = initA1();
private static Integer a2 = initA2();
private static Integer initA2(){
return new Integer(5) / a1;
}
private static Integer initA1(){
return new Integer(5);
}
public Integer getA1(){
return new Integer(a2);
}
public static void main(String[] args) {
LexicalOrderStatic lexLuthor = new LexicalOrderStatic();
System.out.println(lexLuthor.getA1());
}
}
在java中,我可以确定a1在a2之前始终初始化吗?
感谢。如果被问到或者它是否非常简单,Dw就可以了。
答案 0 :(得分:8)
在java中我可以确定a1总是在a2之前初始化吗?
是的,因为规范(section 12.4.2)保证了它(强调我的):
接下来,执行类的类变量初始值设定项和静态初始值设定项,或接口的字段初始值设定项,按文本顺序,就像它们是单个块一样。
请注意,常量早于非常量初始化(步骤6与上面引用的步骤9相比)。
答案 1 :(得分:0)
是。 元素链组(类的名称,静态属性,实例属性,静态方法,内部静态代码块等)(1)在编译时定义,而不是在运行时定义:它有确定性的行为。
当您运行 main 时,您第一次加载了 LexicalOrderStatic ,如果这是第一次加载,则会非常快速地加载静态元素(属性,方法)。
如果您加载 LexicalOrderStatic 的第二个对象,则该属性在两个实例之间共享。
Yu可以在运行此修改后的 main
时看到此语句public static void main(String[] args) {
LexicalOrderStatic lexLuthor = new LexicalOrderStatic();
System.out.println(lexLuthor.getA1());
LexicalOrderStatic lexLuthor2 = new LexicalOrderStatic();
System.out.println(lexLuthor2.getA1());
}
(1)在我提到继承之前,但正如第一条评论所指出的那样情况