为什么Java中的main方法总是需要参数?

dej*_*avu 24 java program-entry-point

为什么Java中的main方法总是需要参数?我们为什么要String[] args每次都写,而不是在我们使用任何参数时写它?

像这样的方法会产生Main method not found编译器错误.由于我们从不对main方法使用任何参数,因此应该允许这样做.

public static void main()
{
}
Run Code Online (Sandbox Code Playgroud)

这不是面试问题.编程时我才想到它.

Ste*_*n C 32

基本上,有四个答案:

  1. 因为这是它的设计方式.是的,我知道这是一个循环的原因.但重点是,这是它的方式,它不会改变.因此,除非您计划设计自己的语言,否则这个问题没有实际意义.

  2. 设计的清洁(又名DRY原则).当一个人可以完成工作时,不要指定两个入口点签名.显然,它可以.

  3. 语义简洁.假设(假设)Java 确实支持两者void main(String[])void main()入口点.如果一个类定义了两个方法会发生什么?这是一个错误吗?如果没有,当存在歧义时哪一个优先?这有点令人困惑吗?

    只允许void main(String[]),JLS可以避免这个问题.

  4. 这类似于标准C和C++入口点签名.(不可否认,一些C/C++运行时也支持其他非标准入口点......但这并不是一件好事...... IMO.)

这些都不意味着以另一种方式做到这一点毫无疑问是错误的.例如,C#为您提供了替代签名,并通过要求开发人员以其他方式指定入口点来处理歧义问题.

FWIW,这个维基百科页面描述了多种语言的"主要"方法.


T.J*_*der 5

因为java运行应用程序的工具会查找main具有特定签名的工具,所以它知道它正在调用正确的签名.Java有方法重载,因此在查找方法时,必须指定相当完整的签名.当然,该java工具可以做一些更复杂的事情(寻找特定的签名,找不到它,寻找任何main东西,如果它只发现一个就调用它),但这不是Java设计者决定做的(并且主观上,FWIW,我认为这是最好的 - 保持简单).

您可以在Java语言规范,第12章:执行中找到详细信息.请注意,当Java获得可变参数列表时,可以通过main两种不同的方式声明:

public static void main(String[] args)
// or
public static void main(String... args)
Run Code Online (Sandbox Code Playgroud)