我有一个问题,为什么main方法被标记为public?
根据stackoverflow上的一个答案,它被声明为静态
"该方法是静态的,因为否则会有歧义:应该调用哪个构造函数?">
但是,有人能解释为什么它总是被声明为公共吗?
因为JLS第12.1.4节这么说:
方法main必须声明为public、static和void。它必须指定一个形式参数(§8.4.1),其声明的类型为String数组。
如果不是public
,则找不到它;你会得到
Error: Main method not found in class Main, please define the main method as:
public static void main(String[] args)
我相信,将main强制为public背后的理性更多地与语言规范有关,而不是是否能够实现某些目标。
参考:http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.1.4
方法main必须声明为public、static和void。它必须指定一个形式参数(§8.4.1),其声明的类型为一串因此,以下任何一种声明都是可以接受的:
Java使用JNI启动Java应用程序在调用私有main时永远不会有任何问题,但这更像是监狱制动器(就像另一个监狱制动器,反射API允许您访问私有方法),绝对不符合Java规范的精神。
如果我还记得JDK1.3的话——从开发人员的角度来看,它不是强制性的。即,JRE甚至正在接受私有主服务器。不过,它并不符合JLS 1.3。
我尝试在JLS 1.3中搜索参考资料,但找不到链接。但我发现,全世界的开发人员都将其报告为一个错误:
请参阅:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4155575
所以,在随后的版本中进行了修复,以强制执行JLS所声明的规则。
现在,重点是为什么JLS的作者一开始就强制执行这个规则——我真的不知道。我唯一能想到的就是——让它"显而易见",不会让开发人员感到困惑。
启动程序的初始化软件必须能够看到main
,以便调用它。
因为这就是所谓的"入口点",如果它是私有的,您的程序将无法运行。
Public
-main方法由JVM调用以运行项目范围之外的方法,因此访问说明符必须是公共的,才能允许从应用程序之外的任何地方进行调用。
来自代码分支
执行代码时,将创建一个JVM,该JVM将充当我们试图执行的代码的容器。将此方法声明为public允许JVM启动代码执行。若方法是私有的,JVM将无法调用它。也有一些方法可以调用私有方法(例如使用反射),但这不是一种标准的方法。
在Java中,类中的函数或变量在从该类创建对象之前是不可访问的,但'main'函数应该在启动时由JVM运行(不启动对象)。因此,'main'被声明为公共以及静态,以便可以在类&甚至不创建对象。
是的,标准规定main
方法在Java中应该是public
。但这不仅仅适用于Java。然而,即使对于C#,main
也必须是public
。
所以在现实世界中想想吧。
例如,你想进入你的房间,但你应该先进入你家的大门(给定的房间在房子里……没有其他方式进入房子)
正门是唯一可供公众使用的接入点。
因为JVM应该在没有任何限制的情况下从任何位置访问主方法。我想你可以在这里找到更多信息:为什么主要方法是公共