2

是否可以让 main 方法接受字符串数组以外的参数?例如,我们可以有一个类似的方法main(Animals[]args){/*code*/}吗?如果不是,那为什么?

4

4 回答 4

6

否 - 入口点始终是带有标头的方法public static void main(String[] args)(即 JVM 调用此特定方法)。你当然可以定义一个方法

public static void main(Animals[] args) {...}

但它不会在运行程序时直接执行。


编辑:该main方法特别具有字符串数组参数的原因是因为该数组将在程序运行时包含命令行参数。直观地说,这些应该是字符串(Animal例如,当然不是 s)。

于 2012-11-06T23:50:57.090 回答
2

因为当您从命令行输入时,您输入的是字符串,而不是复杂类型。

因此,参数是指向字符串的指针(引用)数组是有意义的,包括或不包括(取决于语言)参数的计数。在 Java 中,这不是必需的,因为您可以使用length.

不知道你为什么想要那个?

于 2012-11-06T23:52:43.597 回答
1

规范说它只能处理字符串数组。

于 2012-11-06T23:54:07.260 回答
1

没有什么可以阻止您拥有一个采用 String 以外的参数类型的公共静态 void main。问题是 JVM 需要简单的规则来识别和调用方法。它有一个字符串数组,例如来自命令行,可用于传递给程序。在它开始运行你的程序之前,JVM 如何将它变成一个 Animal 数组或其他类型的数组?

这是一个采用不同参数类型的 main 示例,以及处理从 JVM 拥有的字符串数组生成 Animal 数组的程序本身。当然,给第二个主要方法起一个更有意义的名字确实会更好。

  import java.util.Arrays;

  public class Bad {

    public static void main(String[] args) {
      Animal[] animals = new Animal[args.length];
      for (int i = 0; i < args.length; i++) {
        animals[i] = new Animal(args[i]);
      }
      main(animals);
    }

    public static void main(Animal[] args) {
      System.out.println(Arrays.asList(args));
    }

  }

  class Animal {
    String species;

    public Animal(String species) {
      this.species = species;
    }

    public String toString() {
      return "Animal: " + species;
    }
  }
于 2012-11-07T00:45:23.777 回答