JAVA为什么非公共类应该是可执行的;是不是在它的包装外使用?

时间:2017-07-03 11:49:12

标签: java class jvm

在Java中,我可以从命令行运行/执行非公共(即“默认”访问)java类,即使它在包中。为什么这可能?我们不是因此在它的包之外使用一个不应该是正确的默认类吗?

3 个答案:

答案 0 :(得分:1)

我认为您正在描述类似于以下内容(请参阅Is a class private or public by default in Java and C++?关于java类上可用的可见性修饰符):

class PkgPrivateClass {

  public void doIt() {
    System.out.println("Hello World!");
  }

  public static void main(String[] args) {
    PkgPrivateClass pkgPrivateClass = new PkgPrivateClass();
    pkgPrivateClass.doIt();
  }
}

这会编译并打印Hello World!

现在问题什么是可访问的以及为什么

  • 除了每个静态方法之外,main方法不会也不能执行任何操作。
  • 主要方法只在同一个包中可见(因为该类是包私有)。 启动java程序 - 即调用main方法 - 很难与java程序中的普通方法调用相媲美。

虽然通常不使用包私有类(参见Pros and cons of package private classes in Java?),但我看到两个论点,为什么允许从命令行调用包私有类是有意义的:

  • 明确添加了 public static void main(String[] args)方法。如果您不希望调用此类,则不要添加此方法。

  • 启动JVM时,通常会提供完全限定的类名。有人可能会说这会使命令行调用从这个包执行 - 或者反过来问:从什么包中调用一个主方法?

答案 1 :(得分:0)

访问修饰符默认具有另一个名称,该名称称为特定于包。 因此,如果您在默认类的相同包中,则可以使用命令行执行。在程序包外部,您无法直接执行默认类。

答案 2 :(得分:0)

通过反射调用main(),忽略类可见性。您可以编写自己的执行程序而不是java.exe,它也会检查类可见性,或者不检查main()的可见性。