class Game {
void game1(String ...s) {
System.out.println("game1");
}
void game2(String s[] ) {
System.out.println("game2");
}
public static void main(String []s) {
new Game().game1();
new Game().game2();
}
}
为什么main
方法在没有任何命令行参数的情况下工作,但是当你尝试用String [] a
作为参数执行任何其他方法时,它才会编译,直到我们在其中传递一个参数,为什么?< / p>
答案 0 :(得分:2)
当你从命令行调用main
并输入无参数时,它不等同于main()
的调用,完全没有参数:它相当于传递一个零元素的数组,是不一样的。
当您不传递任何参数时,JVM会创建一个空String
个对象数组,并将其传递给您的main()
,如下所示:
main(new String[0]);
请注意,尝试在零参数的代码中调用main
会导致编译时错误,就像在尝试调用没有参数的game2()
时出错一样。
答案 1 :(得分:2)
基本上,java.exe
(或Unix平台上的java
)是在C
中实现的本机可执行文件,它初始化JVM,加载主类并调用static void main(String[])
方法在主要班级。这是使用JNI API实现的,基本上看起来像
...
mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
"([Ljava/lang/String;)V");
CHECK_EXCEPTION_NULL_LEAVE(mainID);
/* Build platform specific argument array */
mainArgs = CreateApplicationArgs(env, argv, argc);
CHECK_EXCEPTION_NULL_LEAVE(mainArgs);
/* Invoke main method. */
(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);
^^^^^^^^
...
CreateApplicationArgs()
创建一个JNI数据结构,表示根据argv
和argc
参数创建的java数组,这些参数已传递给C
main
函数首先。如果没有给出命令行参数,则此数组为空,但在通过main
调用时始终传递给CallStaticVoidMethod()
。
请参阅(链接可能在将来发生变化)
答案 2 :(得分:0)
如果没有传递命令行参数,java可执行文件将String
类型的空数组传递给main
方法。