javac允许文件名在某些系统中与Class name不同

时间:2013-07-05 17:42:25

标签: java

我的班级

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

进行编译

可以解释为什么吗?

2 个答案:

答案 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编译器可以轻松地在包中找到命名类。在实践中,许多程序员选择将每个类或接口类型放在它自己的编译单元中,无论它是公共的还是由其他编译单元中的代码引用。