为什么类包含main方法不需要在Java中公开?

时间:2013-09-04 15:30:11

标签: java

我写了以下代码  

 
  class Hello //Note the class is not public
  {
        public static void main(String args[]) {
System.out.println("Hello"); } }

因此,当我运行它时,它运行正常并打印输出“Hello”。

但是,如果JVM规范要求主方法应该是公开的,因为“它不能看到主要的”,那么它不应该也适用于类吗?如果JVM在未声明为public时“无法看到”Hello.main(),那么它如何能够看到A类本身。

除了“因为规范说明了吗?”之外,是否有其他解释?

如果JVM能够看到所有类和方法,因为它是“安全/可见性执行器”本身,那么为什么需要将main方法声明为public。

8 个答案:

答案 0 :(得分:8)

只是为了踢,私人课程也可以举行main的演示:

class Outer {
    private static class Inner {
        public static void main(String[] args) {
            System.out.println("Hello from Inner!");
        }
    }
}

从命令行编译并运行良好:

  

C:\ junk> javac Outer.java
  C:\ junk> java外部$内部
  来自内心的你好!

     

C:\垃圾>

答案 1 :(得分:5)

  

如果JVM规范要求主要方法应该公开,因为“它不能   另见主要的“

它可以看到,但它不会将其视为入口点,这就是为什么如果你尝试执行没有这种方法的类,它会给出 NoSuchMethodError:main

通过经典设计,主要切入点 -

  1. 必须命名为 main
  2. 必须公开
  3. 必须静态
  4. 必须无效
  5. 必须一个参数 一个字符串数组
  6. 因此,

    public static void main(String args[])
    

    作为静态,JVM可以在不创建包含main方法的任何类实例的情况下调用它。不确定 main static 设计的主要原因。

    在您的示例中具有默认访问权限的类(如 Hello )仅对同一包中的其他类可见。

答案 2 :(得分:1)

我不认为规范说该课程必须是公开的。 请参阅官方java tutorial上的示例。示例中没有使用main方法的类都声明为Public。

之前在stackoverflow上讨论过这个问题。参考:Package-private class within a .java file - why is it accessible? 解释得很好。

答案 3 :(得分:0)

请注意main是一种早期语言功能。我的猜测是,人们认为私有方法可能会在.class文件中消失,可能是内联的,也可能是一个较短的名称。所以这是一个简单的过度限制(?)约定,用于检索正确的方法:

static void main(String[])

答案 4 :(得分:0)

默认访问说明符是package.Classes可以访问同一个包中其他类的成员。但是在包外面它看起来是私有的,但JVM可以访问所有类,因此JVM可以改变可见性只是为了找到开头该程序因此默认默认为

答案 5 :(得分:0)

首先让我们考虑一下 1.由于main方法是静态的,Java虚拟机可以调用它而无需创建任何包含main方法的类实例。

此: 2.在Java中的类中声明的任何内容都属于引用类型,并且需要在使用它们之前创建对象,但静态方法和静态数据被加载到JVM中的单独内存中,称为上下文,这是在加载类时创建的。如果main方法是静态的,那么它将在JVM上下文中加载并且可以执行。

最后这个: 3.主要方法是任何Core Java程序的入口点。执行从main方法开始。

总而言之:Java首先收取你的Main方法,public使得这个方法可以从JVM的所有地方访问,static在JVM上下文中设置方法所以JVM的第一件事就是加载它是你的主要方法!

Class Hello{}

只需使同一个包中的所有类都可以访问您的类。

答案 6 :(得分:0)

Here's一个类似的问题,答案非常明确。

基本上,JVM可以访问default访问权限或public访问权限的任何类中的main,因为它是入口点。如果该类为privateprotected,则会出现编译错误。

答案 7 :(得分:0)

JVM启动时,它会加载命令行中指定的类(请参阅jls java virtual machine start up),并且您不能在类中使用protectedprivate说明符,以便唯一的选择是public或空白default,这两个访问说明符都允许在同一个包中访问该类。因此,无需为要加载的类指定public关键字。

希望清楚。