public class MyClass{
static{
System.out.println("Weired Behaviour");
}
}
//如果從命令行使用java MyClass(什麼和爲什麼)調用將是輸出?靜態塊奇怪行爲
public class MyClass{
static{
System.out.println("Weired Behaviour");
}
}
//如果從命令行使用java MyClass(什麼和爲什麼)調用將是輸出?靜態塊奇怪行爲
輸出將是:
Weired Behaviour
Exception in thread "main" java.lang.NoSuchMethodError: main
實際上它不Weired。以下是JVM中發生的一系列活動。
當您嘗試調用應用程序時,加載了主類。當JVM加載類時,靜態塊的類會被執行 - 靜態塊是類初始化程序,只有當類被加載到內存中時纔會被調用。
加載類後,JVM嘗試找出入口點 - 主要方法。因爲它找不到主要方法,所以引發異常。
謝謝,你說得對。 –
順便說一句我沒有看到這是[指定的行爲](http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.2)。我認爲它將與JVM的規範兼容,以確定不加載和初始化'main'方法缺失的類。 –
假設你確實有這樣的事情,所以它不會衝你大吼大叫:
public class MyClass{
static{
System.out.println("Weird Behavior");
}
public static void main(String[] args){}
}
您將看到輸出:
Weird Behavior
這是因爲在靜態塊類在JVM加載類時執行。
Static Initalizer是在JVM加載類時,在類的實例創建之前,甚至在任何靜態方法或變量被初始化之前執行的塊。
這將導致該語句「Weired行爲」 的打印,但隨後它會嘗試找到切入點這是「main」方法,那麼它會拋出異常。 Exception in thread "main"
當你這樣做時會發生什麼? –
因爲缺少主要方法,所以你不會有輸出。 –
你期望得到什麼?添加更多細節。 – Sephallia