我的班级
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
进行编译可以解释为什么吗?
答案 0 :(得分:2)
你某些它仍然在你朋友的系统上公开吗?这会让我感到惊讶 - 如果您同时使用Oracle JDK中的javac
进行编译,我希望他们都会抱怨。
也就是说, 不是是一个错误。这是可选的。来自JLS section 7.6:
当且仅当包存储在文件系统(第7.2节)中时,主机系统可以选择强制执行限制,如果找不到类型,则它是编译时错误如果满足以下任一条件,则名称由名称加上扩展名(如.java或.jav)组成的文件:
该类型由声明类型的包的其他编译单元中的代码引用。
该类型声明为public(因此可以从其他包中的代码访问)。
重点是我的,但请注意,这是可选限制。
答案 1 :(得分:1)
对于Oracle JDK中的javac
,您目击的是not possible:
源代码文件名必须具有.java后缀,类文件名必须具有.class后缀,源文件和类文件都必须具有标识该类的根名称。例如,一个名为MyClass的类将写在一个名为MyClass.java的源文件中,并编译成一个名为MyClass.class的字节码类文件。
因此,请仔细检查两者是否使用完全相同的源(两者中都是Foo
public?)并确实使用Oracle JDK。
此要求特定于Oracle JDK。其他实现可能会违反此规定,因为它是JLS:
的可选项当且仅当包存储在文件系统(第7.2节)中时,主机系统可能选择强制执行限制,如果找不到类型,则编译时错误如果满足以下任一条件,则名称由名称加上扩展名(如.java或.jav)组成的文件:
该类型由声明类型的包的其他编译单元中的代码引用。
该类型声明为public(因此可以从其他包中的代码访问)。
这个限制意味着每个编译单元最多只能有一个这样的类型。这种限制使Java编译器可以轻松地在包中找到命名类。在实践中,许多程序员选择将每个类或接口类型放在它自己的编译单元中,无论它是公共的还是由其他编译单元中的代码引用。