【问题标题】:Why main method is marked as public?为什么main方法被标记为public?
【发布时间】:2014-01-07 02:52:35
【问题描述】:

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

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

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

但是,谁能解释为什么它总是被声明为public

【问题讨论】:

  • 所以它可以从任何地方调用?
  • 因为 Java 标准是这么说的 ;)
  • @OliCharlesworth 顺便问一下是什么原因?
  • @drorb 如果我们不公开怎么办?如果没有指定访问修饰符,则该方法是包私有的。

标签: java main public


【解决方案1】:

因为JLS, Section 12.1.4,这样说:

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

如果不是public,则找不到;你会得到

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

【讨论】:

    【解决方案2】:

    我相信,将 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规范。


    如果我记得 JDK 1.3 之前 - 从开发人员的角度来看,这不是强制性的。即 JRE 甚至接受了一个私有的 main。不过,它并没有与 JLS 1.3 内联。

    我尝试搜索 JLS 1.3 以获取参考,但无法获得链接。但我发现它被世界各地的开发者报告为一个错误:

    请参考:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4155575

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

    现在,关键是为什么 JLS 作家首先要强制执行这条规则——我真的不知道。我唯一能想到的就是——让它“显而易见”并且不会让开发人员感到困惑。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • Java 可见性概念不适用于 JVM - 因为 JVM 可以访问任何方法,而不管其定义的访问级别如何。有关详细信息,请参阅下面的答案。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        来自coderanch

        【讨论】:

          【解决方案6】:

          执行代码时,将创建一个 JVM,它将充当我们尝试执行的代码的容器。将此方法声明为 public 允许 JVM 开始执行代码。如果方法是私有的,JVM 将无法调用它。 也有一些方法可以调用私有方法(例如使用反射),但这不是标准的做事方式。

          【讨论】:

            【解决方案7】:

            在 Java 中,类中的函数或变量在从类创建对象之前无法访问,但 'main' 函数应该在启动时运行(没有对象初始化) JVM。因此,'main' 被声明为 public 以及 static,以便可以在类外部访问它,甚至无需创建 Object。

            【讨论】:

              【解决方案8】:

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

              所以只要在现实世界的场景中考虑它。

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

              大门是唯一公开的入口。

              【讨论】:

                【解决方案9】:

                因为 main 方法应该被 JVM 访问,不受任何地方的限制。我想你可以在这里找到更多信息:Why main method is public

                【讨论】:

                • JVM 使用原生 API 执行 main 方法,此处不适用 java 可见性概念。事实上,直到 JDK 1.3 开发人员才能真正编写私有 main。
                猜你喜欢
                • 2014-04-15
                • 1970-01-01
                • 2014-12-20
                • 1970-01-01
                • 2018-01-22
                • 2015-09-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多