2013-07-10 81 views
1

我對靜態Java中幾個問題我們可以在java的非靜態類中有靜態塊嗎?

  1. 我們能否在非靜態類??靜態塊如果 的對象(無靜電)類是在其他一些類的初始化 ,將靜態塊得到執行然後??

  2. 如果存在具有靜塊和可變一個靜態類(INT A = 3)和main()方法,和它被執行然後將可變 初始化發生第一或靜塊執行?我知道 該靜態塊在main()方法之前執行。

+2

是的,我們可以在非靜態類中有一個靜態塊。你還嘗試過什麼? –

+0

靜態代碼塊在第一次加載時執行。 – jahroy

+0

當你說靜態類你的意思是靜態內部類?因爲否則就沒有靜態類。 –

回答

4

1)不,你不能,試試這個

class Test1 { 

    class X { 
     static { <-- compile error: Cannot define static initializer in inner type Test1.X 
     } 
    } 
... 

X應該是靜態的。

注:我認爲我們正在談論嵌套類,因爲這是static修飾符適用於類

2)這取決於,看到這個

class Test1 { 
    static { 
     x = 3; 
    } 

    static int x = 2; 

    public static void main(String[] args) throws Exception { 
     System.out.println(x); 
    } 
} 

輸出

2 

但現在

class Test1 { 
    static int x = 2; 

    static { 
     x = 3; 
    } 

    public static void main(String[] args) throws Exception { 
     System.out.println(x); 
    } 
} 

輸出將

3 

靜態初始化類加載過程中運行唯一的,它的任何實例實例之前,總是會發生的。有趣的是靜態字段初始化靜態初始化塊中的代碼相同的字節函數運行名爲<clinit>

static <clinit>()V 
    L0 
    LINENUMBER 12 L0 
    ICONST_3 
    PUTSTATIC test/Test1.x : I 
    L1 
    LINENUMBER 15 L1 
    ICONST_2 
    PUTSTATIC test/Test1.x : I 
    RETURN 
+0

OHkay..thats我的意思是靜態塊...多數民衆贊成在答案1.什麼是2? – Smatik

+0

@Smatik - 爲什麼不花2秒鐘創建一個測試程序來回答問題2? – jahroy

+0

好的,看我的更新 –

3

請看看這裏http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

這就是所謂的static initializer in the spec。這個代碼將在JVM加載類時執行。運行時系統保證靜態初始化塊按它們出現在源代碼中的順序被調用。

在非靜態內部類不能使用靜態代碼:

public class MyClass { 

    static { 
     System.out.println("static code from nonstatic class"); 
    } 

    class In { 
     /* it will not compile 
     static { 

     } 
     */ 
    } 
    static class In2 { 
     static { 
     System.out.println("static code from static inner class"); 
     } 
    } 
    public static void main(String[] args) { 
     MyClass c = new MyClass(); 
    } 
} 

有關調用順序詳見Detailed Initialization ProcedureThe Java® Language Specification。只是靜態塊按它們在源代碼中出現的順序執行。

1

擁有靜態類與普通類不會影響允許使用的編程結構,而只是控制類是否可以訪問周圍類的實例字段/方法。

+0

這不是真的。即你不能在非靜態內部類中使用靜態代碼。 – zacheusz

0

是的,我們可以在一個non-static類的靜態塊則一旦加載在JVM類加載

public class StaticDemo { 

    static{ 
     System.out.println("already loaded"); 
    } 

    public static void main(String [] args){ 

    } 

} 

此輸出already loaded

+0

謝謝..我認爲它不能在內部類中聲明靜態塊... – Smatik

1

對於問題2,答案可以在Java Language Specification §12.4.2可以發現,在「詳細初始化過程的特定步驟9 「:

接下來,按照文本順序執行類[...]的類變量初始值設定項和靜態初始值設定項,就好像它們是單個塊一樣。

換句話說,所述static {}塊和靜態字段的初始化表達式它們出現在源代碼中的順序執行 - 如果靜態塊是場聲明之前那麼它會首先運行(和見字段的默認值,通常爲null或0),如果靜態塊在字段聲明之後,則它將運行第二個(並且將看到由初始化器表達式分配的值)。

相關問題