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

Posted

技术标签:

【中文标题】为啥必须将 `String[] args` 作为 main() 参数?【英文标题】:Why is it necessary to have `String[] args` as main() parameter?为什么必须将 `String[] args` 作为 main() 参数? 【发布时间】:2016-01-31 23:28:49 【问题描述】:

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

我的问题是为什么在写main()的时候还要写?

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

就在同一天,我在 Viva 中被问到 - “在写 main() 的同时有必要写这个 String args[] 吗?”由于发生的错误,我回答“是”,但在被问到“为什么?”时没有回答。 所以我想知道为什么要写String[] args

【问题讨论】:

检查here 适用的关键字是方法签名。 注意也可以写String... args main(String[] args) 在设计上是 Java 应用程序的入口点。此方法还用于处理在控制台中传递的潜在参数,例如 java YourClass foo barfoobar 将在 args 表中结束)。没有这种方法,Java 将不知道从哪里开始。即使您创建像 main() 这样的方法,它也不会与 main(String[] args) 相同,因此您将无法启动您的应用程序,尽管在您的类中允许使用这种方法,因为您可以拥有其他类,只需添加类似的代码main(String[] args)YourClass.main(); 从您的 mian() 调用代码。 当你运行一个程序时,你可以给它命令行参数。您需要一种将这些命令行参数传递给程序的方法,这是一种简单的方法。它与 JVM 自身的调用方式等价于 Java。你能解释一下你的疑问吗? 【参考方案1】:

来自Java Language Specification 12.1.4

方法main 必须声明为publicstaticvoid。它必须指定一个声明类型为String 的数组的形式参数(第 8.4.1 节)。因此,可以接受以下任一声明:

public static void main(String[] args)

public static void main(String... args)

(请注意,在同一类中不能有两个 main 方法和 String[]String...,因为 varargs 只是语法糖,在编译时将被替换为数组,所以你最终会有两个方法处理String[],并且一个类不能有两个具有相同名称和参数的方法)

所以当你执行类似的命令时

java YourClass foo bar

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

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

java YourType

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

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

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

还请记住,我们可以在我们的类中拥有任何具有正确声明的方法(并且不违反从超类继承的任何规则,例如扩大成员可见性 - 我们不能将受保护的方法公开),所以什么都没有错了

public static void main()
    /*your code*/

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

在 Java 中,入口点必须是 public static void main(String[]) 方法。这就是您运行课程时所调用的内容。不会调用不带参数的 main() 方法。如果您的命令中没有参数,那么您只是在使用长度为 0 的数组调用 main(String[])

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

    public static void main(String[] args) public static void main(String args[]) public static void main(String... args) public static void main(String[] custom_identifier) public static void main(String custom_identifier[]) public static void main(String... custom_identifier)

【讨论】:

感谢您指出所有可能的编写合法“main()”声明的方法!帮了大忙!

以上是关于为啥必须将 `String[] args` 作为 main() 参数?的主要内容,如果未能解决你的问题,请参考以下文章

public static void main(String[] args) - 为啥它实际上是静态的? [复制]

java中的main方法为啥接受无效的String args

为啥在 equals 方法中必须有 2 个 return 语句

为啥我们必须在 python 多线程的 args 中添加逗号','?

使用类作为装饰器时,为啥 'self' 不在 args 中? [复制]

为啥这段代码每次都生成 0000-0000 作为 guid? [复制]