为什么包含main方法的类不需要在Java中公开?
我写了以下代码
class Hello
//Note the class is not public { public static void main(String args[]) {
System.out.println("Hello");
}
}
因此,当我运行它时,它运行正常并打印输出“Hello”。
但是,如果JVM规范要求主方法应该是公共的,因为“它不能看到主要的”,那么它不应该也适用于类吗? 如果JVM“未能看到”Hello.main(),当它未被声明为public时,它如何能够看到A类本身。
除了“因为规范是这样说的”之外,还有其他解释吗?
如果JVM能够看到所有类和方法,因为它是“安全/可见性强制执行器”本身,那么为什么main方法需要声明为public。
只是为了踢,一个私人类也可以保持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 Outer $ Inner
内蒙古你好!C:\垃圾>
如果JVM规范要求主要方法应该公开,因为“它不能看到主要的”
它可以看到,但它没有看到它作为入口点,这就是为什么它给出NoSuchMethodError:main如果你试图执行一个没有这种方法的类。
通过经典设计,主要切入点 –
- 必须命名为main
- 必须公开
- 必须是静态的
- 必须无效
- 必须有一个参数是一个字符串数组
因此,
public static void main(String args[])
作为静态,JVM可以调用它而无需创建包含main方法的任何类实例。 不确定它是否是设计主要 静态的主要原因。
在您的示例中具有类似Hello的默认访问的类仅对同一包中的其他类可见。
我不认为规范说该课程必须是公开的。 请参阅官方java教程中的示例。 示例中没有使用main方法的类都声明为Public。
这在之前讨论过stackoverflow。 请参阅: .java文件中的包 – 私有类 – 为什么它可以访问? 解释得很好。
请注意, main
是早期语言function。 我的猜测是,人们认为私有方法可能会在.class
文件中消失,也许是内联的,也许是一个较短的名称。 所以这是一个简单的过度限制(?)约定,用于检索正确的方法:
static void main(String[])
package.Classes可以访问同一个包中其他类的成员。但是在包外面它看起来是私有的,但JVM可以访问所有类,因此JVM可以改变可见性,只是为了找到程序的开头因此它默认为默认值
首先让我们考虑一下1.由于main方法是静态的,Java虚拟机可以调用它而无需创建包含main方法的任何类实例。
这个:2.在Java中的类中声明的任何东西都是在引用类型下引用并且需要在使用它们之前创建对象,但静态方法和静态数据被加载到JVM中的单独内存中,称为上下文,这是在加载类时创建的。 如果main方法是静态的,那么它将在JVM上下文中加载并且可以执行。
最后这个:3。主要方法是任何Core Java程序的入口点。 执行从main方法开始。
总而言之:Java首先收取你的Main方法, public
使这个方法可以从JVM的各个地方访问,并在JVM上下文中static
设置方法,所以JVM加载它的第一件事就是你的主要方法!
Class Hello{}
只需使同一个包中的所有类都可以访问您的类。
这是一个类似的问题,有一个非常直截了当的答案。
基本上,JVM可以访问default
访问或public
访问的任何类中的main,因为它是入口点。 如果该类是private
或protected
,则会出现编译错误。
当JVM
启动时,它会加载命令行中指定的类(请参阅jls java虚拟机启动 ),并且您不能在类中使用protected
或private
说明符,因此唯一的选择是使用public
或者只有空白default
和这两个访问说明符都允许在同一个包中访问该类。 因此,无需为要加载的类指定public
关键字。
希望清楚。