为什么main方法在没有命令行参数的情况下工作?

时间:2014-10-15 10:23:41

标签: java

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>

3 个答案:

答案 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数据结构,表示根据argvargc参数创建的java数组,这些参数已传递给C main函数首先。如果没有给出命令行参数,则此数组为空,但在通过main调用时始终传递给CallStaticVoidMethod()

请参阅(链接可能在将来发生变化)

答案 2 :(得分:0)

如果没有传递命令行参数,java可执行文件将String类型的空数组传递给main方法。