为啥 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 是一个或多个单词,它们可能是 intfloatcharString。以上所有内容都可以表示为Strings

希望对您有所帮助

【讨论】:

【参考方案2】:

唯一可以可靠给出的答案是“because the JLS says so”。引用:

方法main 必须声明为publicstaticvoid。它必须指定一个声明类型为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 方法需要是静态的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

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

java调用同一个类中的方法为啥要将方法申明成静态?

为啥main方法在java中是静态的[重复]

java中为啥要把main方法定义为一个static方法

为啥单例对象创建的scala程序不需要静态main方法?

类方法和静态方法