当前位置: 首页 > 知识库问答 >
问题:

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

穆彬郁
2023-03-14

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

像这样的方法会生成Main方法未找到编译器错误。由于我们从不对main方法使用任何参数,因此应该允许这样做。

public static void main()
{
}

这不是面试问题。编程的时候突然想到的。

共有3个答案

曾英睿
2023-03-14

当JVM开始执行java程序时,它会搜索具有此签名的main方法(即字符串数组)

邹野
2023-03-14

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

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

public static void main(String[] args)
// or
public static void main(String... args)
齐晟
2023-03-14

基本上,有四个答案:

>

  • 因为这就是它的设计方式。是的,我知道这是一个循环原因。但关键是它就是这样,不会改变。所以除非你打算设计自己的语言,否则这个问题没有实际意义。

    设计的清洁度(也称为DRY原则)。当一个可以完成工作时,不要指定两个入口点签名。很明显,它可以。

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

    通过仅识别 void main(String[]),JLS 避免了该问题1

    这类似于标准的 C 和 C 入口点签名。(诚然,一些C / C运行时也支持其他非标准入口点,但这并不完全是一件好事2

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

    FWIW,这个维基百科页面用多种语言描述了“main”方法。

    1 - 虽然你会遇到一个“问题”,即刚接触Java的人可能会(错误地)猜测多个入口点应该工作,尝试一下,然后得到一个惊喜。但我不认为任何设计都能应付“猜测编程”。
    2 - 首先,这是一个可移植性问题。

  •  类似资料:
    • 问题内容: 为什么Java中的main方法总是需要参数?为什么我们每次都要写,而不是在使用任何参数时才写? 这样的方法会生成编译器错误。由于我们从不对main方法使用任何参数,因此应允许这样做。 这不是面试问题。编程时才想到。 问题答案: 基本上,有四个答案: 因为那是它的设计方式。是的,我知道这是一个循环的原因。但是关键是这就是它的样子,并且不会改变。因此,除非您打算设计自己的语言,否则这个问题

    • 问题内容: 是编写Java程序所需的主要方法吗? 这是我的代码: 它显示了编译时的错误: 问题答案: Java程序不需要main方法。正如其他人指出的那样,Web应用程序不使用main方法。 在独立应用程序中甚至不需要它。考虑 我编译并运行并获得以下结果: 对于独立应用程序,您必须具有 主要方法或 静态初始值设定项。 Main是首选。

    • 问题内容: 这些方法之间在功能上有区别吗? 编辑(从其他贡献者添加了此语法): 问题答案: 不,但第一个是首选样式。 编辑: 另一个选项是 此外,它还允许调用者使用varargs语法。

    • 问题内容: 我写了下面的代码 因此,当我运行它时,它可以正常运行并打印输出“ Hello”。 但是,如果JVM规范要求该main方法应该是公开的,因为“否则它就看不到main”,那么它也不适用于该类吗?如果JVM在未声明为public时“看不到” Hello.main(),它将如何看到类A本身。 除了“因为规范这样说”以外,对此还有什么解释吗? 并且,如果JVM能够看到所有类和方法,因为它本身就是

    • 问题内容: 当我只是尝试使用 Java 编写一些程序时,我尝试使用变量,我知道变量必须在声明时进行初始化,但是在main方法内部它接受了没有初始化的变量。我不知道是什么原因。任何人都可以告诉我原因。 谢谢 码: 问题答案: 对于 实例变量水平 最终变量只能初始化一次。 必须 在构造函数结束之前 初始化类级别的最终变量。 对于 本地(方法)级别 方法级别的最终变量只能初始化一次。 使用前* 必须先初

    • 问题内容: 我在内部类中有一个私有方法,我想使用SafeVarargs批注。但是,我需要使用静态方法或最终方法。为什么私有方法也需要最终确定?这不是多余的吗? 问题答案: 这是多余的,并且您提出了一个很好的观点。 我认为要求final或static的真正原因是强制不能重写该方法,因此子类不能以使@SafeVarargs注释对方法的定义无效的方式篡改数据。 但是,尽管这是多余的,但它并不是一个糟糕的