簡體   English   中英

為什么 `main` 在這里被調用了兩次?

[英]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被調用了兩次:

  1. 明確地,一旦加載 class,就會從static 初始化塊開始。
  2. 隱含地,在程序啟動后立即進入程序。

如何解決這個問題? 要么不要顯式調用它,要么重命名它,這樣它就不會被自動調用。

你覺得有什么不尋常的? 加載 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM