两种主要方法具有不同的签名

我有下课。

public class Test { public static void main(Integer[] args) { System.out.println("This is not a main"); } public static void main(String[] args) { System.out.println("This is the main"); } } 

在这里有两个main方法,它们接受Integer[]String []作为输入参数。 我的问题是JVM如何总是加载第二个方法作为这个类的主要方法。 为什么总是将输入参数视为String array

因为这就是Java一直在寻找的东西。 Java语言规范,第12.1.4节 :

方法main必须声明为public,static和void。 它必须指定一个forms参数(第8.4.1节),其声明的类型是String数组

因为字符串是您传递到命令行的内容。

45来自

myProgram.exe 45

不是整数。 它是一个包含字符45的字符串

恰好可以使用像"45"这样的字符串来表示整数。 反过来做起来有点困难。(至少对用户而言)

因为命令行参数总是Strings

我们总是输入命令行参数作为字符串 。 🙂

除了其他人提到的内容,您可以使用var-args来实现String数组。

 public static void main (String ...a) 

有关详细信息,请查看此文档

http://docs.oracle.com/javase/tutorial/getStarted/application/

并且

使用int而不是String:public static void main(int [] args)

正如其他人所说, main方法将始终由JVM调用,带有一个带字符串数组的重载。 如果您愿意,您可以自由地对该方法进行其他重载。 您甚至可以在代码中自己调用它们。 只是VM专门寻找一个带有字符串数组的重载。

这是JVM认可的唯一签名作为主要方法

 public static void main(String[] args) 

您可以根据需要使用尽可能多的重载主方法但是只有具有上述签名的方法才会被jvm调用

命令行参数是main()方法的参数,它们在运行时传递给它。 由于Java仅使用String类型的命令行参数,因此JVM忽略了传递Integer的另一个main()方法。

java中main方法的签名是public static void main(String[] args) {} ,这就是JVM的类加载器在程序开始时加载的内容。 除非你在main中手动执行,否则不会调用带有Integer参数的另一个main。 尝试修改你的代码,如下所示,你会注意到什么都不会被调用,你的程序将不会打印任何东西。

 public class Test { public static void main(Integer[] args) { System.out.println("This is not a real main so nothing gets printed"); } } 

顺便说一下,你可以用你想要的任何参数编写一个重载的main方法。 只要参数不是String []或String …是相同的,任何东西都不会开始滚动程序。