2015-04-14 93 views
-4

我期望非靜態塊總是在創建對象時執行。但在下面的例子中,我調用了靜態方法,但執行了非靜態塊。我沒有創建任何對象,爲什麼非靜態塊會執行?什麼時候在java中執行非靜態塊?

class Example { 
    static void Mark() { 
    System.out.println("Mark method"); 
    { 
     System.out.println("Hello"); 
    } 
    } 
} 

public class StaticObject { 
    public static void main(String[] args) { 
    Example.Mark(); 
    } 
} 

結果:

Mark method 
Hello 
+3

沒有縮進,這基本上是不可讀的。 –

+1

你只是在一個靜態方法中有一個塊,它與你的問題文本不匹配。 –

回答

9

你不必在你的例子非靜態初始化塊。方法內部的塊只是作爲方法的一部分執行的代碼。 (嵌套代碼塊引入了一個新的範圍,因此您可以創建在塊之外不可見的變量。)

它只是一個初始化器,如果它在類內但在方法聲明之外。如果更改了代碼塊移動到任何方法之外:

class Example { 
    static void Mark() { 
     System.out.println("Mark method"); 
    } 

    // now it's an instance initializer 
    { 
     System.out.println("Hello"); 
    } 
} 

,那麼你應該看到當對象實例化實例初始化代碼執行。如果你沒有實例化一個對象,就像你的例子那樣,那麼實例初始化器就不會運行。

+0

非常感謝你,現在我明白了... – Albertkaruna