在Java中,我可以从命令行运行/执行非公共(即“默认”访问)java类,即使它在包中。为什么这可能?我们不是因此在它的包之外使用一个不应该是正确的默认类吗?
答案 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!
。
现在问题什么是可访问的以及为什么:
虽然通常不使用包私有类(参见Pros and cons of package private classes in Java?),但我看到两个论点,为什么允许从命令行调用包私有类是有意义的:
您明确添加了 public static void main(String[] args)
方法。如果您不希望调用此类,则不要添加此方法。
启动JVM时,通常会提供完全限定的类名。有人可能会说这会使命令行调用从这个包执行 - 或者反过来问:从什么包中调用一个主方法?
答案 1 :(得分:0)
访问修饰符默认具有另一个名称,该名称称为特定于包。 因此,如果您在默认类的相同包中,则可以使用命令行执行。在程序包外部,您无法直接执行默认类。
答案 2 :(得分:0)
通过反射调用main(),忽略类可见性。您可以编写自己的执行程序而不是java.exe,它也会检查类可见性,或者不检查main()的可见性。