为什么包含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
采用经典设计,主要切入点-
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.javaC:\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可以访问它,还是它只是语法的一部分