为什么`main`在这里被叫两次?

时间:2012-04-10 20:12:16

标签: java static main

这是我的代码:

public class Test
{
   static 
   {
      main(null);
   }
   public static void main(String [] args)
   {
      System.out.println("done");
   }
}

我得到以下输出:

done 
done

有人可以解释一下原因吗?

7 个答案:

答案 0 :(得分:6)

原因是main被调用两次:

  1. 明确地,一旦加载了类,就从static initialization block开始。
  2. 一旦程序开始,就会一直隐含在程序输入上。
  3. 如何解决这个问题?要么不要显式调用它,要么重命名它,以便不会自动调用它。

答案 1 :(得分:3)

你觉得什么不寻常?加载类时会执行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]

答案 2 :(得分:2)

因为

  • 在JVM中加载类static { ... }时调用Test部分(它是一种静态构造函数)
  • ,而执行开始时调用main方法。

答案 3 :(得分:1)

首次加载类时,将调用类的静态块。这是第一次完成的。第二个是因为您正在运行该程序,然后调用main方法。

答案 4 :(得分:1)

虚拟机在加载jar时会自动调用main。所以这是第一个'完成',这是Java程序的正常入口点。

编写第二个'Done'是因为您在静态类初始值设定项中显式调用它。只要您的类由虚拟机类加载器加载,就会调用添加到“Test”类的“静态”部分。

在调用入口点Main之前,甚至应该从静态初始化程序调用,因为在调用入口点之前需要加载类。

答案 5 :(得分:1)

在调用Test.main之前,JVM需要通过运行静态初始化程序来初始化Test类。此呼叫负责main()的第一次呼叫。初始化完成后,JVM再次调用main(),最终生成您看到的输出。

答案 6 :(得分:1)

Main由JVM自动调用。无需在静态部分调用它。

public class Test
{
   public static void main(String [] args)
   {
      System.out.println("done");
   }
}

上面的代码应该是它。