[英]Why is `main` called twice here?
這是我的代碼:
public class Test
{
static
{
main(null);
}
public static void main(String [] args)
{
System.out.println("done");
}
}
我收到以下 output:
done
done
有人可以解釋一下這是為什么嗎?
原因是main
被調用了兩次:
如何解決這個問題? 要么不要顯式調用它,要么重命名它,這樣它就不會被自動調用。
你覺得有什么不尋常的? 加載 class 時會執行一次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]
因為
static {... }
部分在 class Test
加載到 JVM 中時被調用(它是一種 static 構造函數)main
方法在執行開始時被調用。首次加載 class 時,將調用 class 的 static 塊。 這是第一個完成的。 第二個是因為你正在運行程序,然后調用了 main 方法。
虛擬機在加載 jar 時自動調用 main。因此這是第一個“完成”,Java 程序的正常入口點。
第二個“完成”是因為您在 static class 初始化程序中顯式調用它而編寫的。 一旦您的 class 被虛擬機 class 加載程序加載,您添加到“測試”class 的“靜態”部分就會被調用。
static 初始化程序中的那個甚至應該在調用入口點 Main 之前調用,因為 class 需要在調用入口點之前加載。
在調用Test.main
之前,JVM 需要通過運行其 static 初始化程序來初始化Test
class。 此調用負責main()
的第一次調用。 初始化完成后,JVM 再次調用main()
,最終生成您看到的 output。
Main由JVM自動調用,不需要在static段調用。
public class Test
{
public static void main(String [] args)
{
System.out.println("done");
}
}
上面的代碼應該是這樣的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.