Java 为什么这里两次叫“main”?
这是我的密码:Java 为什么这里两次叫“main”?,java,static,main,Java,Static,Main,这是我的密码: public class Test { static { main(null); } public static void main(String [] args) { System.out.println("done"); } } 我得到以下输出: done done 谁能解释一下原因吗?原因是main被调用了两次: 显式地,在类加载后立即从 隐式地,在程序启动后立即输入程序 如何解决这个问题?不要显式调用它,
public class Test
{
static
{
main(null);
}
public static void main(String [] args)
{
System.out.println("done");
}
}
我得到以下输出:
done
done
谁能解释一下原因吗?原因是
main
被调用了两次:
如何解决这个问题?不要显式调用它,也不要重命名它,这样它就不会被自动调用。在首次加载类时,会调用类的静态块。这是第一次。第二个原因是您正在运行程序,然后调用main方法。因为
- 当类
加载到JVM中时,调用Test
部分(它是一种静态构造函数)static{…}
- 而执行开始时调用
方法main
- 你认为有什么不寻常之处?加载类时,
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]
当虚拟机加载jar时,会自动调用main。因此,这是第一个“完成”,是Java程序的正常入口点 编写第二个“Done”是因为您在静态类初始值设定项中显式调用它。添加到“Test”类的“static”部分将在虚拟机类装入器装入类后立即调用
甚至应该在调用入口点Main之前调用静态初始值设定项中的一个,因为在调用入口点之前需要加载类。在调用
Test.Main
之前,JVM需要通过运行其静态初始值设定项来初始化Test
类。此调用负责main()
,最终生成您看到的输出。main由JVM自动调用。无需在静态部分调用它
public class Test
{
public static void main(String [] args)
{
System.out.println("done");
}
}
上面的代码应该是这样的。请阅读。无论您告诉我什么,我知道,但问题是,我们在静态中的main方法中传递null作为参数,它应该有一些字符串,因为您没有使用传递给main的参数。传递给main方法的内容无关紧要。它将被调用。我们是在静态块中的主方法中传递null作为参数,应该是stringI。我只是因为静态块中的主方法中存在null参数而感到困惑,请告诉我它是否会产生任何问题,因为主方法期望字符串类型为argument@saurabhRai:
main
methodexpectedString
arr是的,不是字符串
。null
也不太正确,因为main
方法总是由JVM提供参数数组-如果没有参数,这个数组是空的,但不是null
。