這裏是我的代碼:爲什麼`main`在這裏被調用兩次?
public class Test
{
static
{
main(null);
}
public static void main(String [] args)
{
System.out.println("done");
}
}
我得到以下輸出:
done
done
有人可以請解釋我這樣做的原因是什麼?
這裏是我的代碼:爲什麼`main`在這裏被調用兩次?
public class Test
{
static
{
main(null);
}
public static void main(String [] args)
{
System.out.println("done");
}
}
我得到以下輸出:
done
done
有人可以請解釋我這樣做的原因是什麼?
您認爲什麼不尋常?該static
塊被執行一次時,類裝載(和它具有執行main
方法之前被加載然後main
方法本身執行
檢查出這個修改版本:
public class Test {
static {
main(new String[]{"[done static]"});
}
public static void main(String[] args) {
System.out.println(args.length > 0 ? args[0] : "[done]");
}
}
它打印:
[done static]
[done]
我們傳遞null作爲主要方法存在於static中的參數,它應該是字符串 – 2012-04-10 20:19:57
我只是因靜態塊內main方法中存在null參數而感到困惑,請告訴我會說它會產生任何問題,因爲主要方法期望一個字符串類型作爲參數 – 2012-04-10 20:28:10
@saurabhRai:'main'方法需要'String ** **數組**,而不是'String'。另外'null'不是很正確,因爲'main'方法總是由JVM提供參數數組 - 如果沒有參數,這個數組是空的,但不是'null'。 – 2012-04-10 20:30:12
的原因是main
被調用兩次:
如何解決這個問題?要麼不明確地調用它,要麼重命名它,以便它不會被自動調用。
當第一次加載類時,會調用類的靜態塊。這是第一次完成。第二個是因爲你正在運行程序,然後調用main方法。
無論你告訴我,我知道,但問題是,我們傳遞null作爲靜態主要方法中的參數,它應該有一些字符串 – 2012-04-10 20:17:29
由於您沒有使用傳遞給main的參數,它並不重要,你是什麼傳遞給主要方法。它只會被調用。 – 2012-04-10 20:25:27
謝謝,最後你提供了我正在尋找的解決方案 – 2012-04-10 20:31:53
由於
Test
在JVM(它是一種靜態構造的)main
方法被稱爲內部加載的static { ... }
部分被調用。主要是通過在加載罐虛擬機自動調用,所以這是第一個「完成」,正常的切入點Java程序
012。第二個'完成'是因爲您在靜態類初始化程序中顯式調用它而編寫的。一旦虛擬機類加載器加載類,就會調用添加到「Test」類中的「靜態」部分。
應該從靜態初始化程序甚至在入口點Main被調用之前調用它,因爲在調用入口點之前需要加載類。
在調用Test.main
之前,JVM需要通過運行其靜態初始化程序來初始化Test
類。此電話是第一次致電main()
。初始化完成後,JVM再次調用main()
,最終生成您看到的輸出。
Main由JVM自動調用。不需要在靜態部分中調用它。
public class Test
{
public static void main(String [] args)
{
System.out.println("done");
}
}
上面的代碼是它應該是。
請閱讀[this](http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html)。 – mre 2012-04-10 20:14:41