Java 为什么主方法可以';不属于默认范围?

Java 为什么主方法可以';不属于默认范围?,java,Java,如果我们用默认作用域(非公共)和公共main方法声明类,它将成功执行。在这里,类范围比主方法范围严格得多 但若我们将main方法声明为默认方法,那个么JVM将抛出错误。为什么? class DefaultTest { public static void main(String[] args) { System.out.println("output........."); } } 成功运行,但 class DefaultTest {

如果我们用默认作用域(非公共)和公共main方法声明类,它将成功执行。在这里,类范围比主方法范围严格得多

但若我们将main方法声明为默认方法,那个么JVM将抛出错误。为什么?

class DefaultTest {
    public static void main(String[] args) {
        System.out.println("output.........");
    }
}
成功运行,但

class DefaultTest {
    static void main(String[] args) {
        System.out.println("output.........");
    }
}
这不会


我的意思是,如果类本身不是公共的,JVM仍然可以访问main方法,这意味着main不需要是公共的。但是如果我们不将它声明为public,它将抛出一个错误。

如果没有使用修饰符(例如,
public
),那么只有类和包可以运行该方法。这意味着外部世界无法运行main方法。这就是为什么需要使用
public

定义方法的原因。Java指定了几个访问修饰符,例如private、protected和public。在Java中声明为公共的任何方法或变量都可以从该类外部访问。因为主方法是公共的
Java,JVM可以轻松地访问和执行它

Java语言规范指定了它,请参见第12.1.4章。调用Test.main:

main方法必须声明为public、static和void


JVM规范也需要它,请参阅@A4L的答案。

公共类和方法可以由包内或包外的任何人访问。因此,由于jvm iyself的类加载器位于不同于默认或您的包的包中,因此您需要将main与public access修饰符一起放入static,这样jvm就可以运行该方法,而不必实例化类对象
+
public
,这样JVM就可以自由访问它,而不存在任何访问问题。

我认为这只是Java语言中的一条规则。
从技术上讲,我看不到其他原因(因为即使

它不是公共的(JVM仍然可以找到它并调用它)

因为主要的方法是网关,从这里可以访问您的项目。如果将此主网关设置为专用,则无法访问应用程序的功能。

Java虚拟机通过使用引导类加载器(§5.3.1)创建初始类来启动,该类以依赖于实现的方式指定。Java虚拟机然后链接初始类,对其进行初始化,调用公共类方法void main(String[])。此方法的调用将驱动所有进一步的执行。执行构成主方法的Java虚拟机指令可能会导致链接(从而创建)其他类和接口,以及调用其他方法


因此,它是以这种方式指定的,jvm供应商必须尊重它

Main方法必须严格遵循其语法;其他明智的JVM将无法找到它,您的程序将无法运行

它们是公共的,因为JVM必须能够访问它们才能开始执行程序。如果它不是公共的,那么只有类和包成员才能访问它,而JVM不能


Main是在任何类中执行的第一个方法。它们是静态的,因为它们必须可以在没有对象实例的情况下执行

问题是JVM通常运行这种方法。所以这不是一条规则吗?技术上需要吗?@peter.petrov关于可见性的一切都是“规则”。在这个特殊的例子中,由于不是其他Java代码运行
main
,所以它不是真正必要的,但从概念上讲,它清楚地表明每个人都可以运行它。@Darkhogg好吧,“从概念上讲,它清楚地表明每个人都可以运行它”——是的,但从技术上讲,我不认为它公开的理由。我以为这就是OP的要求。@Darkhogg“关于可见性的一切都是规则”,我不会这么说。我的意思是,如果它是从Java代码调用的,那么OK,它必须是公共的。但是,正如JVM中所说的那样,我并不认为公共性是必须的。你明白我的意思。@peter.petrov从技术上讲,它也没有理由被称为
main
。事实上,如果您使用applet,就不会定义
main
方法。这只是一个惯例。我认为A4L和Andreas的答案支持我的观点。这只是联合联络小组规定的一项公约,不是严格的必要条件。但是,是的,如果允许非公开的方法作为主要方法,那将是丑陋和不合逻辑的。没错——不幸的是,我没有官方来源证明这一点,但我认为这是语言设计师的想法。所以,IMHO唯一可证明的答案是:jls指定了它,所以实现者必须遵循它……伙计,如果你阅读了其余的,我也提到了这一点。试着给询问者提供更多的信息。你似乎很难读懂:D,是k,我也有同样的问题。哈哈,这是我的错,因为我没有一个好的格式。我会修好的如果类本身不是公共的,jvm仍然可以访问main方法,这意味着main不需要是公共的。但是,如果我们不将它声明为public,它将抛出错误。这并不能解释main方法
public
的原因。它根本没有帮助--…如果它不是public,JVM将无法访问它?!来吧。@assylias 7天前xDI的意思是,如果类本身不是公共的,jvm仍然可以访问main方法,这意味着main不需要是公共的。但是,如果我们不将其声明为public,它将抛出error.to通过JVM从类、包和其他位置或网络外部访问main方法。你可以在这里找到更多的解释:虽然这个答案是正确的,但它与“它必须是公开的,因为它必须是公开的(因为JLS这么说)”。如果您添加一些信息,说明如果我们让
main
不成为
public
,会发生什么坏事,那就太好了。从技术上讲,没有理由——您可以实现一个jvm启动器,它甚至可以启动一个私有方法