我的班级是
public class Foo {}
文件名是Test.java
但是在我的系统中,当我编译它时显示以下错误
test.java:1: class Foo is public, should be declared in a file named Foo.java
public class Foo {
^
1 error
但是在我的朋友系统中,它被编译了,我们都在使用 oracle JDK
任何人都可以解释为什么?
我的班级是
public class Foo {}
文件名是Test.java
但是在我的系统中,当我编译它时显示以下错误
test.java:1: class Foo is public, should be declared in a file named Foo.java
public class Foo {
^
1 error
但是在我的朋友系统中,它被编译了,我们都在使用 oracle JDK
任何人都可以解释为什么?
您确定它仍然在您朋友的系统上公开吗?这会让我感到惊讶——如果你们都使用javac
Oracle JDK 进行编译,我希望双方都会抱怨。
也就是说,它不一定是错误。这是可选的。从JLS 第 7.6 节:
当且仅当包存储在文件系统中(第 7.2 节)时,如果在由类型名称组成的名称下的文件中未找到类型,主机系统可能会选择强制限制它是编译时错误如果满足以下任一条件,则加上扩展名(例如 .java 或 .jav):
该类型由声明该类型的包的其他编译单元中的代码引用。
该类型被声明为公共的(因此可以从其他包中的代码中访问)。
重点是我的,但请注意,这是一个可选限制。
对于javac
Oracle JDK,您所目睹的事情是不可能的:
源代码文件名必须有 .java 后缀,类文件名必须有 .class 后缀,源文件和类文件都必须有标识类的根名称。例如,一个名为 MyClass 的类将被写入一个名为 MyClass.java 的源文件中,然后编译成一个名为 MyClass.class 的字节码类文件。
因此,请仔细检查您是否都使用完全相同的源(Foo
两者都是公开的?)并且确实使用了 Oracle JDK。
此要求特定于 Oracle JDK。其他实现可能违反这一点,因为它是可选的JLS:
当且仅当包存储在文件系统中(第 7.2 节)时,如果在由类型名称组成的名称下的文件中未找到类型,则主机系统可能会选择强制执行它是编译时错误的限制如果满足以下任一条件,则加上扩展名(例如 .java 或 .jav):
该类型由声明该类型的包的其他编译单元中的代码引用。
该类型被声明为公共的(因此可以从其他包中的代码中访问)。
这个限制意味着每个编译单元最多只能有一个这样的类型。此限制使 Java 编译器可以轻松地在包中找到命名类。在实践中,许多程序员选择将每个类或接口类型放在自己的编译单元中,无论它是公共的还是被其他编译单元中的代码引用。