2013-08-05 48 views
1

我有一個簡單的代碼如下:
匿名塊像個靜態塊

class TempClass 
{ 
    {  
     System.out.println("inside static..."); 
    } 

    TempClass() 
    { 
     System.out.println("inside constructor..."); 
    } 

    public static void main(String [] args) 
    { 
     new TempClass(); 
    } 
} 

它顯示輸出: 內的靜...... 內部構造......

但是,當我發表評論實例創建線,它顯示空白輸出。 因此,無論何時調用構造函數,它都充當靜態塊。 這是否意味着寫入靜態不是強制性的(當類被實例化時)?

任何人都知道這種行爲的任何事情?

+0

如果它是一個靜態塊,它會顯示它的輸出,即使沒有實例化類,因爲你加載它來調用main。你的假設是雙重錯誤的。 – arjacsoh

回答

8
{ 
     System.out.println("inside static..."); 
} 

...不是static塊,它是一個實例塊。

static { 
     System.out.println("inside static..."); 
} 

...將是static塊。

+0

謝謝@Mena! 是的,我知道它不是靜態塊 - 但我也不知道它是一個初始化塊。 –

6
{ 
    System.out.println("inside static..."); 
} 

一個靜態塊,而不是它的實例塊,它被轉換爲類似這樣

class TempClass 
{ 
    TempClass() 
    { 
     { 

      System.out.println("inside static..."); 
     } 
     System.out.println("inside constructor..."); 
    } 
} 
1

這不是static block。 沒有static關鍵字的塊被稱爲instance blocksinitializer blocks
Java編譯器將初始化塊複製到每個構造函數中。
參考的Java docs

初始化語句塊實例變量看起來就像靜態初始化塊,但沒有static關鍵字:

在java中有兩個備選方案,以使用構造函數初始化實例變量:初始化塊和最終方法。使用final方法
使用初始化塊

class Whatever { 
    private int myVar ; 
    { 
    // initialization code goes here 
     myvar = 10; 
    } 
} 

class Whatever { 
    private int myVar = initializeInstanceVariable(); 

    protected final int initializeInstanceVariable() { 

    // initialization code goes here 
    return 10; 
    } 

}

1

其實,有沒有在你的代碼的任何static塊。如果它在那裏,你可以運行並且無需實例化出來