2014-01-21 66 views
2

我有一個類:當在java中訪問一個靜態變量時,一個類是否會被加載到內存中?

public class Foo { 
    public static boolean flag = false; 
    //some code 
} 

我用這boolean標誌另一個類:

public class FooImpl{ 
    public static void main (String args[]) { 
     if (Foo.flag){ 
      //Line 1 
      //some code 
     } 
    } 
} 

因此,在Line 1,確實類Foo被完全加載到內存或只是靜態變量變加載默認值?

+0

我想你可以從這個[鏈接]一些認識[1] [1]:http://stackoverflow.com/questions/6569557/what-is-the-actual-memory-靜態變量的地方 – ppuskar

回答

3

甲類的靜態初始化通常第一次以下事件中的一個發生前立即發生的情況:

  • 的類的實例被創建,
  • 的類的一個靜態方法被調用時,
  • 類的靜態字段被分配,
  • 非恆定的靜態字段被使用,或

請參閱JLS 12.4.1

+1

及其所謂的懶惰初始化...這是推遲初始化發生儘可能晚.. – TheLostMind

-3

當存在對該類的靜態引用時,該類將被加載。它由ClassLoader [java.lang.ClassLoader]加載。

當您訪問類成員或構造函數[創建該類的實例]時,需要有關該類的信息並將其加載。

對於某些庫函數調用,您可能已經看到一些ClassNotFoundException。 ClassLoader就在後面。

但還有其他的事實是,當類中的某些東西被首先使用時,類會被初始化。

Initialization of a class consists of executing its static initializers and the initializers 

對於在類中聲明的靜態字段(類變量)。

在第1行中,您指的是類的成員,其加載的肯定是

初始化時發生:

T是一個類並且創建T的實例。

  • T是一個類,由T聲明的靜態方法被調用。
  • 由T聲明的靜態字段被分配。
  • 使用由T聲明的靜態字段,並且該字段不是常量變量
  • T是頂級類,並且執行在詞彙上嵌套在T中的斷言語句。

靜態字段(§8.3.1.1)僅引起類或 接口,實際上聲明它的初始化,即使它可能是通過一個子類的 名被稱爲參考,子接口,或者實現接口的類。

+1

如果他們讓我知道錯誤,讓每個人都可以學習包括我,那麼Downvote會受到歡迎。 – Dineshkumar

+2

我不是downvoter,我同意你的觀點。不過,我發現你的答案很難閱讀。 –

+1

當有任何尚未滿足的類的引用時,該類將被加載,無論是否爲靜態或其他。您的編輯與您的原始答案矛盾。剩下的就是表達不好。 -1 – EJP

相關問題