为啥 main 方法需要是静态的? [复制]
Posted
技术标签:
【中文标题】为啥 main 方法需要是静态的? [复制]【英文标题】:Why main method needs to be static? [duplicate]为什么 main 方法需要是静态的? [复制] 【发布时间】:2012-12-28 11:00:20 【问题描述】:可能重复:Why is the Java main method static?
JAVA还支持反射JAVA为什么需要main方法是静态的?
使用反射我们可以创建类的对象,甚至可以调用该类的方法,所以为什么 JAVA 需要 main 方法是静态的。
感谢您的 cmets。
【问题讨论】:
如果你需要实例化的类在其构造函数中有参数怎么办?你如何从反射中推断它们? 不,Alvin,我知道为什么 main 方法有这个声明,但我更关心的是即使 VM 能够创建类的对象并调用方法,那么为什么会这样。 @Alvin - 上下文不同...... this answer 会回答这个问题吗? 【参考方案1】:public static void main(String []args)
中每个关键字的解释
1.public
:
它必须是public
,因为JVM
不是class
的一部分,您可以在其中定义main
方法。所以,它不应该是private
2.static
:JVM
不会构造任何对象来调用main
。并且 main 不依赖于class
。
3.void
:main
不会向JVM
返回任何有用的信息。程序执行从main()
开始,如果正常退出,则以main
中的最后一条语句结束。在这之间会发生很多。
4.main
:
它只是一个专有名词,用于表明方法的重要性。
5.Array of Strings
:
传递给 main 的 args 是一个或多个单词,它们可能是 int
、float
、char
或 String
。以上所有内容都可以表示为Strings
。
希望对您有所帮助
【讨论】:
【参考方案2】:唯一可以可靠给出的答案是“because the JLS says so”。引用:
方法
main
必须声明为public
、static
和void
。它必须指定一个声明类型为String
数组的形式参数(第 8.4.1 节)。
【讨论】:
是的,我同意你的观点,我知道它必须是 public static void 但如果我们得到概念反射,我们必须知道 VM 甚至能够创建包含 main 方法的类对象并调用它使用反射。那么为什么它需要是静态的。 @AmolFasale +1 假设除了创建一个对象(必须创建一个默认或固定的构造函数)只是为了启动一个程序之外没有任何收获。这会使创建该类的更多实例变得复杂。 @AmolFasale 对于要执行的程序,它必须有 some 入口点,在 Java 中它是给定类的main()
方法(可以指定Main-Class
在清单中)。限制 main()
可以是什么允许 JVM 能够“运行代码”。就这么简单。【参考方案3】:
嗯,反射是从 Java 1.1 开始引入的,所以最初的 Java 1.0 标准不能基于它们。他们可能有一些类似反射的代码只是为了引导,并且不知道在 Java 仍被称为 Oak 的时候它有多完整。
此外,这可能是从 C++ 继承的,并进一步从 C 继承。虽然 C++ 也可以先构造一个应用程序对象并在其上调用 virtual main()
,但这可能看起来太复杂了,选择使用简单的 @987654322 @,C 开发人员熟悉。
【讨论】:
【参考方案4】:公共:为了让 JVM 能够访问 main 方法,它必须是公共的。
静态:因为它非常复杂,或者可能无法预见托管 main 方法的类的实例化标准,所以它必须是静态的,这样 JVM 就可以在不需要的情况下调用它从类中创建一个对象。
毕竟,在定义一种语言时,您需要一个明确的约定,如果没有这样的强制约束,JVM 设计人员可能会遇到麻烦。
【讨论】:
【参考方案5】:因为当您运行程序时,运行时环境会寻找带有签名public static void main (String[] args)
的方法。即使支持反射,运行时仍然需要先调用一个类的main
方法。
【讨论】:
以上是关于为啥 main 方法需要是静态的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章