2015-11-19 71 views
1

從我對Java的理解中,應該在任何其他函數之前執行靜態塊。Android - Static Block不被首先調用,爲什麼?

我有一個靜態塊調用一個靜態函數,無論是在類MyClass.java,它使用SharedPreferences對象。

MyClass由MyApplication(Extends Application)使用,位於onCreateMethod的某處。

static { 
    doSomethingStaticFirst(); 
} 

private static void doSomethingStaticFirst() { 

     //Log(DO_SOMETHING_STATIC_FIRST) 

     UserPreferences userPreferences = new UserPreferences(MyApplication.getInstance().getApplicationContext()); 
} 

但是我看到以下日誌依次是:

  1. MyApplication的onCreate方法
  2. 的DatabaseManager的onUpdate(如果DB版增加)
  3. DO_SOMETHING_STATIC_FIRST

有爲什麼不首先執行靜態塊?將首先執行MyApplication onCreate方法嗎?

+0

您所顯示的代碼是哪一類?它在'MyApplication'中嗎?它在'DatabaseManager'中嗎?它在別的地方嗎? – CommonsWare

+0

其他地方,MyApplication使用的類 – htafoya

+0

可能的重複[何時是一個類的靜態塊被執行?](http://stackoverflow.com/questions/9130461/when-is-the-static-block -of-A級執行的) – Krease

回答

5

你的假設是不準確的。

當你的課程是加載 - 這是第一次在代碼中引用時執行類中的靜態塊。

如果您確實需要早些時候執行您的靜態塊,則可以強制加載類 - 類似於執行路徑中較早的Class.forName("com.foo.MyClassWithStaticFunctions")將強制靜態塊更快執行。