在JAVA中,类名必须始终与文件名相同,但有时文件包含多个类。文件中只有单个类(或接口)可以是公共的,并且它必须与文件具有相同的名称。但是,如果文件名有多个不公开的类(或接口),那么文件名是如何确定的?
interface Foo {}
class Bar{}
有些人似乎对此问题感到困惑
我实际上知道,无论我选择Foo还是Bar作为文件名,它都能正常工作。然而,如果存在某种命名类的约定,那么我的兴趣是什么。
为什么我不喜欢它的名字呢?因为我实际上是在编写一个重构代码的应用程序,每当它重命名类时,我都需要知道如何以及何时更改我的文件名。
到目前为止,我认为正确的方法是:
如果类有公共节点,请将其名称用作文件名, 否则只选择第一个节点,所以在这个例子中 Foo 会赢。所以我简化了这个问题:这是正确的方式,还是还有更多的东西?
答案 0 :(得分:4)
引用Java语言规范,第7.6节Top Level Type Declarations :
当且仅当包存储在文件系统(第7.2节)中时,主机系统可以选择来强制执行限制,即如果找不到类型,则编译时错误如果以下任一情况属实,则名称由类型名称加上扩展名(例如
.java
或.jav
)组成的文件:
该类型由声明类型的包的其他编译单元中的代码引用。
该类型声明为
public
(因此可以从其他包中的代码访问)。此限制意味着每个编译单元最多只能有一个这样的类型。这种限制使Java编译器可以轻松地在包中找到命名类。在实践中,许多程序员选择将每个类或接口类型放在它自己的编译单元中,无论它是公共的还是由其他编译单元中的代码引用。
因此,正如您所看到的那样,并不要求“类名必须始终与文件名相同”,正如您所说的那样。
这只是一种允许某些编译器在编译期间找到类源代码的简单方法的方法。
但更重要的是,它还可以帮助人找到源代码。如果您看到对课程com.example.Foo
的引用,则您确切知道在何处找到它,因为它将位于文件com/example/Foo.java
中。
非公共(包私有)顶级类在技术上可以放在任何名称的文件中,并且多个这样的类可以捆绑在一个文件中,但这使得它们很难找到。出于这个原因,我看到了一个指南(不记得在哪里)说你应该总是将顶级类放在他们自己的文件中,但有一个例外:
基本上这意味着您应该将任何名称不是文件名的顶级类视为“文件范围”,即使它在技术上是封装范围的。
答案 1 :(得分:1)
有两条规则可供遵循:
第一条规则:该类可以包含(默认)或公开可见性
第二条规则:您已定义为public的类必须在具有相同名称的.java源文件中实现,但非公共类可以在源文件中使用其他名称