2012-02-20 100 views
2

考慮一個Java class with static fields only和沒有構造:什麼時候會靜態類初始化?

public class OnlyStatic { 
    static O1 o1 = new o1(); 
    static O2 o2 = new o2(); 

    public static int compute(int whatever) { 
     return o1.foo+o2.bar+whatever; 
    } 
} 

在不同的類,該方法compute被使用,或者通過static import

static import OnlyStatic.compute 
int a = OnlyStatic.compute(3); 

或者直接,假定呼叫者是在相同的封裝:

int a = OnlyStatic.compute(3); 

當是01和02的ini tialized?在進口時,還是第一次調用compute()

+0

http://java.sun.com/docs/books/jls/third_edition/html/execution.html#44557 – MByD 2012-02-20 13:05:38

回答

5

對象o1o2不適用於您的static上下文,也不會將它們也設置爲static

JVMS指出當類初始化

Further

類或接口類型Ť

在類聲明的任何靜態初始化執行將在第一次出現以下任何一項之前立即初始化:

  • Ť是一個類和Ť被創建的一個實例。
  • T是由聲明的類和靜態方法T被調用。
  • 分配了T聲明的靜態字段。
  • 使用由T聲明的靜態字段,該字段不是常量變量(§4.12.4)。
  • Ť是頂層類,並且斷言語句(§14.10)詞法嵌套Ť內是執行 。

所以你的情況,當靜態方法compute()是第一執行

+0

修復了靜態聲明。你直接指什麼?在進口時,還是第一次打電話? – 2012-02-20 13:08:08

+0

「...不延遲加載」。嚴格來說這不是真的。 ''OnlyStatic'類是由JVM延遲加載的。但是在加載類時,靜態字段會立即初始化。 – 2012-02-20 13:08:38

+0

@ A.H。 - 是在導入時還是方法調用時加載的類? – 2012-02-20 13:11:19