2015-10-20 60 views
-3

我知道靜態塊是在類加載時執行的。我想問 - 他們是靜態加載還是動態加載?因爲我知道有兩類類加載 - 靜態和動態。如果它們是靜態加載的,那麼爲什麼它們的輸出在運行時顯示而不是在編譯時?爲什麼在編譯時不顯示輸出?

+5

哪個jvm應該在編譯時給你輸出? – SomeJavaGuy

+0

我感到困惑 - 這些類在編譯時加載,而靜態塊在類加載時執行意味着在編譯時...意味着輸出在編譯時準備就緒....我是對的嗎?那麼爲什麼在運行時產生輸出。 –

+0

編譯只是簡單地創建.java文件的二進制文件表示形式,並創建一個代表性的.class文件作爲交換。在編譯時加載變量或類似的東西沒有任何作用。如果您想了解更多信息,可以查看[JLS 13](https://docs.oracle.com/javase/specs/jls/se8/html/jls-13.html) – SomeJavaGuy

回答

1

我知道靜態塊是在類加載時執行的。

這並不完全準確。當班級初始化時,他們被執行。這種情況發生在班級被加載和班級被「使用」之間。

-他們(靜態塊)靜態加載或動態加載?

靜態塊與它們所屬的類同時加載。類可以靜態加載或動態加載。

但是,在Java上下文中,「靜態加載」仍然在運行時發生。

Java中的靜態和動態加載之間的區別是在加載的類之間,因爲它們是通過源代碼中的Java標識符命名的,以及通過調用Class.forName(name)以及等效項加載的類。

如果它們是靜態加載的,那麼爲什麼它們的輸出在運行時顯示而不是在編譯時?

在Java環境下,所有加載發生在運行時。所以靜態塊的所有輸出將在運行時顯示。