2012-06-29 120 views
-2
public class MyClass{ 
    static{ 
     System.out.println("Weired Behaviour"); 
    } 
} 

//如果從命令行使用java MyClass(什麼和爲什麼)調用將是輸出?靜態塊奇怪行爲

+1

當你這樣做時會發生什麼? –

+0

因爲缺少主要方法,所以你不會有輸出。 –

+0

你期望得到什麼?添加更多細節。 – Sephallia

回答

3

輸出將是:

Weired Behaviour 
Exception in thread "main" java.lang.NoSuchMethodError: main 

實際上它不Weired。以下是JVM中發生的一系列活動。

當您嘗試調用應用程序時,加載了主類。當JVM加載類時,靜態塊的類會被執行 - 靜態塊是類初始化程序,只有當類被加載到內存中時纔會被調用。

加載類後,JVM嘗試找出入口點 - 主要方法。因爲它找不到主要方法,所以引發異常。

+0

謝謝,你說得對。 –

+0

順便說一句我沒有看到這是[指定的行爲](http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.2)。我認爲它將與JVM的規範兼容,以確定不加載和初始化'main'方法缺失的類。 –

0

假設你確實有這樣的事情,所以它不會衝你大吼大叫:

public class MyClass{ 

    static{ 
     System.out.println("Weird Behavior"); 
    } 

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

} 

您將看到輸出:

Weird Behavior 

這是因爲在靜態塊類在JVM加載類時執行。

0

Static Initalizer是在JVM加載類時,在類的實例創建之前,甚至在任何靜態方法或變量被初始化之前執行的塊。

這將導致該語句「Weired行爲」 的打印,但隨後它會嘗試找到切入點這是「main」方法,那麼它會拋出異常。 Exception in thread "main"