这是我的代码:
public class Test
{
static
{
main(null);
}
public static void main(String [] args)
{
System.out.println("done");
}
}
我得到以下输出:
done
done
有人可以解释一下原因吗?
答案 0 :(得分:6)
原因是main
被调用两次:
如何解决这个问题?要么不要显式调用它,要么重命名它,以便不会自动调用它。
答案 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)
因为
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");
}
}
上面的代码应该是它。