这是我的代码:
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]
因为
static { ... }
当类在 JVM 中加载时调用该部分Test
(它是一种静态构造函数)main
执行开始时调用该方法。类的静态块在类首次加载时被调用。这是第一个完成的。第二个是因为您正在运行程序,然后调用了 main 方法。
虚拟机在加载 jar 时会自动调用 main。所以这是第一个“完成”,Java 程序的正常入口点。
编写第二个“完成”是因为您在静态类初始化程序中显式调用它。一旦你的类被虚拟机类加载器加载,你添加到“测试”类的“静态”部分就会被调用。
甚至应该在调用入口点 Main 之前调用静态初始化程序中的那个,因为需要在调用入口点之前加载类。
在调用之前Test.main
,JVM 需要Test
通过运行其静态初始化程序来初始化该类。此调用负责第一次调用main()
. 初始化完成后,JVM 再次调用main()
,最终生成您看到的输出。
Main 由 JVM 自动调用。不需要在静态部分中调用它。
public class Test
{
public static void main(String [] args)
{
System.out.println("done");
}
}
上面的代码应该是这样的。