Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么包含main方法的类不';不需要在Java中公开吗?_Java - Fatal编程技术网

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

为什么包含main方法的类不';不需要在Java中公开吗?,java,Java,我编写了以下代码 class Hello //Note the class is not public { public static void main(String args[]) { System.out.println("Hello"); } } 因此,当我运行它时,它运行良好并打印输出“Hello” 然而,如果JVM规范要求main方法应该是公共的,因为“否则它就看不到main”,那么它不也应该应用于类吗?如果JVM在未

我编写了以下代码
 
  
class Hello
//Note the class is not public {
public static void main(String args[]) {

System.out.println("Hello");
}
}

因此,当我运行它时,它运行良好并打印输出“Hello”

然而,如果JVM规范要求main方法应该是公共的,因为“否则它就看不到main”,那么它不也应该应用于类吗?如果JVM在未声明为public时“看不到”Hello.main(),那么它如何能够看到类A本身呢

除了“因为说明书上这么说”之外,还有其他解释吗


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

我认为规范没有说类必须是公共的。 参考官方网站上的示例。示例中带有main方法的类都没有声明为Public

这在前面的stackoverflow中讨论过。参考:
解释得很好。

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

static void main(String[])

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

。 1.由于main方法是静态的,所以Java虚拟机可以调用它,而无需创建包含main方法的类的任何实例

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

最后是: 3.Main方法是任何核心Java程序的入口点。执行从main方法开始

总之:Java首先对主方法收费,
public
使JVM可以从任何地方访问此方法,
static
在JVM上下文中设置此方法,以便JVM加载的第一件事就是您的主方法

Class Hello{}
只需让同一个包中的所有类都可以访问您的类

如果JVM规范要求主方法应该是公共的,因为“它不能” 请参阅“其他主要信息”

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

采用经典设计,主要切入点-

  • 必须命名为main
  • 必须是公开的
  • 必须是静态的
  • 必须无效
  • 必须有一个参数,即字符串数组
  • 因此,

    public static void main(String args[])
    
    由于是静态的,JVM可以调用它,而无需创建包含main方法的类的任何实例。不确定这是否是主管道设计为静态的主要原因

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

    一个类似的问题,答案相当直截了当


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

    JVM
    启动时,它会加载命令行中指定的类(请参阅),类中不能有
    受保护的
    私有的
    说明符,因此您唯一的选择是使用
    公共的
    或仅为空的
    默认的
    ,这两个访问说明符都允许在同一个包中访问类。因此,不需要为要加载的类指定
    public
    关键字


    希望它是清楚的。

    仅用于kicks,一个演示,私有类也可以容纳
    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外部$internal
    你好,来自内心

    C:\junk>


    也在非默认包中运行!好吧,忘了我当时说的吧,我完全错了。你在说明书的哪里找到了“它看不到主要内容”这句话?答案很多。参考我的答案,我在上面发布了一个类似讨论的链接,这表明课堂不必公开。规范没有这样说。是什么让你认为会出现编译错误?因为我试过;-)外部类只能有
    public
    access修饰符。但是一个内部类肯定可以是
    私有的
    受保护的
    。根据我所研究的,一个类只能有两个访问修饰符。公共或默认。您应该添加点#5:“必须命名为
    main
    ”@TedHopp不知道我怎么没有声明它。谢谢。@SajalDutta谢谢你,伙计。你的解释准确而令人满意@KhanZaid欢迎您。@SajalDutta这也是类不能声明为私有、受保护的原因之一吗?很好,我从来不知道这是可能的。请注意,在linux bash中,您需要退出它,即运行
    java Outer\$Inner
    。感谢您的回复。我的问题是JVM要求main()是公共的,以便从任何地方访问它。但是如果包含main()的类不是public的,那么main()是public的目的是什么(即它的可见性受到该类的限制)您认为main必须声明为public的原因是为了JVM可以访问它,还是它只是语法的一部分