繁体   English   中英

为什么包含main的类不必公开?

[英]Why doesn't the class containing main have to be public?

我宣布了以下课程

class A { //not public
  public static void main(String args[]) {
     System.out.println("done");
 }

当我编译并运行它时,它可以正常运行并打印输出“ done”。 即使我声明它在“ package a”中,也具有相同的行为;

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

除了“因为规范这样说”以外,对此还有什么解释吗?

JVM始终可以访问应用程序中的每个类,因为它的职责之一是强制执行可见性规则。 因此,可以得出一个结论,即如果需要可以忽略可见性规则(例如,当用户启动应用程序时,JVM必须找到入口点,即main() )。

换句话说,JVM不是访问此函数的类,因此可见性不适用。 它基本上是监督者,负责从执行到终止的整个过程。

有关参考,请参见执行

当您将类声明为private ,您并不是使它“不可见”,方法也是如此。 声明一个private方法只是意味着它不能从您的类外部调用 私有类的静态公共方法是可公开调用的。

JVM之所以可以看到非公共类,是因为它控制可见性,这意味着它可以看到一切并决定可以看到/调用/访问的内容。

在类上使用public不同于在方法上使用public ,但是概念相同。

在方法上, public关键字表示该方法可以在类之外使用。 一个例子是:

class A {
  public static void do() {
    // Do something
  }
}

class B {
  public static void main(String[] args) {
    A.do(); // This works because do() is public and static
  }
}

相同的概念适用于类,但方式不同。

在类上使用public意味着可以在当前.java文件之外使用它(它将拥有自己的.class文件)。

这是一个例子:

//C.java

  class C {
    static void do() {
      // Do something
    }

    public static void run() {
      A.do();  // Works because A.do() is public and static
      B.do();  // Does not work because B is not a public class
    }
  }



//A.java

  public class A {
    public static void main(String[] args) {
      B.do(); // Works because B is in the same file
      do();   // Duh...
    }

    public static void do() {
      // Do something
    }
  }

  class B {
    static void do() {
      // Do something
    }
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM