5

我有以下课程。

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始终将第二种方法加载为此类的主要方法。为什么总是考虑输入array参数String

4

10 回答 10

14

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

方法 main 必须声明为 public、static 和 void。它必须指定一个声明类型为字符串数组的形式参数(第 8.4.1 节)

于 2013-08-12T19:11:47.643 回答
5

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

45从_

我的程序.exe 45

不是整数。它是一个包含字符的字符串,4并且5

碰巧你可以使用一个字符串"45"来表示一个整数。反过来做起来有点困难。(至少对于用户来说)

于 2013-08-12T19:11:17.860 回答
4

由于命令行参数始终是Strings.

于 2013-08-12T19:11:41.810 回答
2

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

于 2013-08-12T19:13:09.177 回答
1

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

public static void main (String ...a)
于 2013-08-12T19:22:27.217 回答
0

有关更多信息,请查看此文档

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

并且

使用 int 代替字符串:public static void main (int[] args)

于 2013-08-12T19:13:24.780 回答
0

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

于 2013-08-12T19:13:28.957 回答
0

这是唯一被 JVM 识别为主要方法的签名

public static void main(String[] args)

您可以拥有任意数量的重载主方法,但只有具有上述签名的方法才会被 jvm 调用

于 2013-08-12T19:14:29.190 回答
0

命令行参数是main()在运行时传递给方法的参数。由于 Java 仅使用String类型命令行参数,JVM 会忽略main()传递 Integer 的其他方法。

于 2013-08-12T19:14:53.933 回答
0

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...,就不会开始滚动程序。

于 2013-08-12T19:23:51.397 回答