为什么Java中的main方法总是需要参数?为什么我们每次都要编写String[]参数
,而不是在使用任何参数时编写它?
像这样的方法会生成Main方法未找到
编译器错误。由于我们从不对main方法使用任何参数,因此应该允许这样做。
public static void main()
{
}
这不是面试问题。编程的时候突然想到的。
当JVM开始执行java程序时,它会搜索具有此签名的main方法(即字符串数组)
因为运行应用程序的java
工具寻找带有特定签名的main
,所以它知道它正在调用正确的签名。Java有方法重载,所以在查找方法时,您必须指定一个相当完整的签名。当然,java
工具可以做一些更复杂的事情(寻找特定的签名,如果没有找到它,寻找任何main
,如果它只找到一个,就调用它),但这不是Java设计者决定做的(主观上,FWIW,我认为这是最好的
您可以在Java语言规范第12章:执行中找到详细信息。请注意,当Java得到变量参数列表时,可以用两种不同的方式声明main
:
public static void main(String[] args)
// or
public static void main(String... args)
基本上,有四个答案:
>
因为这就是它的设计方式。是的,我知道这是一个循环原因。但关键是它就是这样,不会改变。所以除非你打算设计自己的语言,否则这个问题没有实际意义。
设计的清洁度(也称为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注释对方法的定义无效的方式篡改数据。 但是,尽管这是多余的,但它并不是一个糟糕的