2014-03-06 36 views
2

我只花了五分钟在SO中查找重复项。Java中静态变量和初始化顺序的文本顺序

我的问题很简单。以下代码是否总能正常工作?

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就可以。

回答

8

在java中,我可以肯定a1总是在a2之前初始化?

是的,因为本说明书(section 12.4.2)保证它(重点煤矿):

接着,执行任一类变量初始化和类的静态初始化,或者在接口,的字段初始文本订单,好像他们是一个单一的块。

注意常数早于非常数初始化(步骤6步骤9上面引述的比较)。

+1

骄傲的是指出由您先生回答:) – cgon

0

是的。 (1)是在编译时定义的,而不是在运行时定义的:它有一个确定的行为(0,1,2) 。

当您运行主要,你在第一时间LexicalOrderStatic和静态元素(属性,方法)已加载加载速度非常快,如果这是第一次装载。

如果加载第二个对象LexicalOrderStatic,则该属性将在两个实例之间共享。

郁可在运行此看到这个语句修改主要

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)之前我提到继承,但it'snt的情况下,由第一评论

+2

这里不清楚“继承链”究竟是什么意思,或者为什么它是相关的 - 在这个例子中没有使用继承。 –

+0

纠正了,我的误解。谢谢 – alepuzio