没有公共类的.java文件的Java编译

ano*_*981 7 java

好的,所以java源文件必须至少有一个公共类,该文件应该被称为"class-name.java".很公平.

因此,如果我有一个类,那么以下将编译:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // Display the string.
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我从上面的代码中删除'public'访问修饰符,那么代码仍会编译.我只是不明白.删除它,代码如下:

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // Display the string.
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,由于我删除了"public"访问修饰符,因此我的类具有默认或包私有访问权限,即它不能从外部访问,只能从包中访问.

所以我的问题是,上面的代码是如何编译的?在这种情况下,文件HelloWorld.java没有'public'HelloWorld类(只有一个包私有的HelloWorld.class),因此我的理解不应该编译.

感谢您回答我的问题!

问候,匿名

Qwe*_*rky 10

一个java源文件必须至少有一个公共类,该文件应该被称为class-name.java

不正确,顶级类不必声明为public.JLS声明;

如果顶级类或接口类型未声明为public,则只能从声明它的包中访问它.

请参阅http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#104285第6.6.1节.


Mar*_*era 2

您可以将非公共类放入文件中,这不是错误而是功能。

您的问题在于打包级别,而不是编译级别。因为你可以用非公共类编译这个文件,但你不能从外部调用它,所以它不能作为应用程序基类

像这样:

// [+] single file: SomeWrapper.java 

public class SomeWrapper {
    ArrayList<_PrivateDataType> pdt;
}
// [-] single file: SomeWrapper.java 

// [+] single file: _PrivateDataType.java 
class _PrivateDataType {
    // members, functions, whatever goes here
}

// [-] single file: _PrivateDataType.java 
Run Code Online (Sandbox Code Playgroud)