Java 为什么main方法被标记为public?

Java 为什么main方法被标记为public?,java,main,public,Java,Main,Public,我有一个问题,为什么main方法被标记为public 根据stackoverflow的回答,它被声明为static “该方法是静态的,因为否则会有歧义:应该调用哪个构造函数?” 但是,任何人都能解释为什么它总是被声明为公共的吗?启动程序的初始化软件必须能够看到main,这样它才能调用它。因为 main方法必须声明为public、static和void。它必须指定一个形式参数(§8.4.1),其声明类型为字符串数组 如果它不是公共的,那么就找不到它;你会得到 Error: Main method

我有一个问题,为什么main方法被标记为public

根据stackoverflow的回答,它被声明为static

“该方法是静态的,因为否则会有歧义:应该调用哪个构造函数?”


但是,任何人都能解释为什么它总是被声明为公共的吗?

启动程序的初始化软件必须能够看到
main
,这样它才能调用它。

因为

main方法必须声明为public、static和void。它必须指定一个形式参数(§8.4.1),其声明类型为字符串数组

如果它不是
公共的
,那么就找不到它;你会得到

Error: Main method not found in class Main, please define the main method as:
   public static void main(String[] args)

Public
-JVM调用main方法来运行项目范围之外的方法,因此访问说明符必须是公共的,以允许从应用程序之外的任何地方调用


因为这就是所谓的“入口点”,如果它是私有的,您的程序将无法运行

是的,标准规定,
main
方法应该是Java中的
public
。但这不仅仅适用于Java。但是,即使对于C#,
main
也必须是
public

所以,只要在现实世界的场景中思考一下

例如,你想进入你的房间,但你应该先进入你家的正门(给定的房间在房子里面……没有其他方式进入房子)


正门是唯一公开的接入点

因为JVM应该访问main方法,而不受任何位置的限制。我想您可以在这里找到更多信息:

我相信,强制执行main as public背后的理性更多地与语言规范有关,而不是是否能够实现某些目标

参考:

main方法必须声明为public、static和void。它必须 指定其声明类型为数组的形式参数(§8.4.1) 一串因此,以下任一声明均可接受:

Java使用JNI启动Java应用程序在调用私有main时永远不会有任何问题,但这更像是一个jail-brake(就像另一个jail-brake,反射API允许您访问私有方法),并且绝对不符合Java规范的精神


如果我还记得JDK1.3的话——从开发人员的角度来看,它不是强制性的。i、 e.JRE甚至接受了一条专用干管。尽管如此,它并没有与JLS 1.3内联

我尝试搜索JLS 1.3以获得参考,但无法获得链接。但我发现全世界的开发者都把它当作一个bug来报道:

请参阅:

因此,在后续版本中进行了修复,以执行JLS规定的规则


现在,关键是为什么JLS writer一开始就实施了这一规则——我真的不知道。我能想到的唯一一件事是——让它对开发人员来说“显而易见”且不令人困惑。

执行代码时,将创建一个JVM,它将充当我们试图执行的代码的容器。将此方法声明为public允许JVM启动代码执行。若方法是私有的,JVM将无法调用它。
也有调用私有方法的方法(例如通过使用反射),但这不是一种标准的方法。

在Java中,类中的函数或变量在从类创建对象之前是不可访问的,但“main”函数应该在启动时运行(不启动对象),由JVM执行。因此,将“main”声明为publicstatic,这样就可以在类外访问它&甚至不需要创建对象。

这样就可以从任何地方调用它?因为Java标准这么说;)@OliCharlesworth顺便问一下,原因是什么?看看@drorb的答案,如果我们不公开怎么办?如果没有指定访问修饰符,则方法是包私有的。JVM使用本机API执行主方法,java可见性概念在此不适用。事实上,直到JDK1.3开发人员能够真正编写私有main.Java可见性概念才适用于JVM,因为JVM可以访问任何方法,而不考虑其定义的访问级别。有关详细信息,请参见下面的答案。