2014-03-06 63 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