为什么必须将 `String[] args` 作为 main() 参数?

Why is it necessary to have `String[] args` as main() parameter?

我不是在问 (String args[]) 是什么,因为这里已经回答了这个问题:What is "String args[]"? parameter in main method Java.

我的问题是为什么一定要边写main()边写?

我参加了实践考试,遇到问题并意识到我在写 public static void main() 时没有写 String args[]。但是写了main(String args[])之后问题就解决了。 (如何以及为什么我仍然不知道!)

同一天我在 Viva 被问到我被问到 - "Is it necessary to write this String args[] while writing main()?" 并且由于发生的错误我回答了 "YES" 但是当被问到 "WHY?" 时我没有回答。
所以想知道为什么要写String[] args.

它用于命令参数。如果没有它们,JVM 将不得不在尝试调用该方法之前执行检查以查看该方法是否包含参数,以确定它是否可以执行 main()main(args)(两种语法正确的方法,具有不同的方式来打电话给他们)

来自 Java Language Specification 12.1.4

The method main must be declared public, static, and void. It must specify a formal parameter (§8.4.1) whose declared type is array of String. Therefore, either of the following declarations is acceptable:

public static void main(String[] args)

public static void main(String... args)

(请注意,您不能在同一个 class 中使用 String[]String... 的两个 main 方法,因为 varargs 只是语法糖,在编译时将被替换为数组,因此您最终会得到两种处理方法 String[] 和一种 class 不能有两种具有相同名称和参数的方法)

所以当你执行像

这样的命令时
java YourClass foo bar

Java 虚拟机将在 String[] 数组中放置 foobar 参数,并将尝试将该数组传递给可以接受的 main 方法它作为参数。

当命令没有任何参数时也会使用此方法,例如

java YourType

这个决定简​​化了我们的生活,因为我们不需要专注于处理有两个入口点的情况

  • 一个用于带参数的命令
  • 还有一个命令没有任何参数。

我们可以简单地允许用户传递参数,但如果我们不想处理它们,我们可以简单地忽略它们。

还要记住,我们可以在 class 中使用任何具有适当声明的方法(并且不违反从 superclass 继承的任何规则,例如扩大成员可见性 - 我们可以' t make protected method public), 所以拥有

没有错
public static void main(){
    /*your code*/
}

但是你需要意识到这个方法不能用作入口点,所以如果你想从这个方法开始你的应用程序你需要创建适当的main 方法将执行 你的 main() 方法:

public static void main(String ...){
    main();
}

在 Java 中,入口点必须是 public static void main(String[]) 方法。当你 运行 你的 class 时,这就是所谓的。没有参数的 main() 方法将不会被调用。如果您的命令中没有参数,您只是用长度为 0.

的数组调用 main(String[])

为了解决 Viva 问题,参数的标识符仅由编译器使用并且可以更改,以及 [] 的备用位置或使用 String... 指定数组。所以这似乎是一个技术问题,但您可以使用以下任何一种:

  1. public static void main(String[] args)
  2. public static void main(String args[])
  3. public static void main(String... args)
  4. public static void main(String[] custom_identifier)
  5. public static void main(String custom_identifier[])
  6. public static void main(String... custom_identifier)