6

我写了以下代码

 
  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。

4

8 回答 8

9

只是为了好玩,私人课程也可以举行的演示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:\垃圾>

于 2013-09-04T16:23:46.983 回答
4

if JVM spec mandates that main method should be public since "it can't see main otherwise"

It can see but it doesn't see it as the entry point and that is why it gives NoSuchMethodError: main if you try to execute a class having no such method.

By classic design, the main entry point-

  1. Must be named main
  2. Must be public
  3. Must be static
  4. Must be void
  5. Must have one argument that is an array of string

Hence,

public static void main(String args[])

Being static, JVM can call it without creating any instance of class which contains the main method. Not sure if it is the main reason for main being static by design.

A class with default access like Hello in your example is only visible to other classes in the same package.

于 2013-09-04T15:55:36.887 回答
1

我不认为规范说该类必须是公共的。参考官方java教程中的例子。示例中所有具有 main 方法的类均未声明为 Public。

之前在 stackoverflow 上讨论过这个问题。参考:.java 文件中的包私有类 - 为什么它可以访问? 解释得很好。

于 2013-09-04T15:39:00.610 回答
0

这是一个类似的问题,答案非常简单。

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

于 2013-09-04T15:58:44.007 回答
0

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

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

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

所以总而言之:Java 首先为您的 Main 方法充电,public让 JVM 可以从任何地方访问此方法,并static在 JVM 上下文中设置该方法,以便 JVM 加载它的第一件事就是您的 main 方法!

Class Hello{}

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

于 2013-09-04T15:49:30.377 回答
0

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

static void main(String[])
于 2013-09-04T15:39:14.847 回答
0

默认访问说明符是包。类可以访问同一包中其他类的成员。但在包之外它显示为私有但 JVM 可以访问所有类,因此 JVM 可以更改可见性只是为了找到程序的开头因此它默认设置为默认值

于 2013-09-04T15:42:23.877 回答
0

when JVM starts it loads the class specified in the command line (see the jls java virtual machine start up), and you cannot have protected or private specifier in the class so the only option for you is to either have public or just blank default and both these access specifier allows the class to be accessed inside the same package. So there is no need for specifying public keyword for the class to load.

Hope its clear.

于 2013-09-04T16:08:31.797 回答