为什么我不能给文件名赋予不同的名字?

uza*_*y95 9 java

当我想创建一个java类时,它会自动生成一个具有相同类名的文件.

但是当它生成一个类时,它可以更改与类名不同的文件名.我错过了什么吗?

alt text http://content.screencast.com/users/uzay95/folders/Jing/media/9533b1df-6194-4660-aada-2f7c4e0df6c0/2009-12-24_1603.png

替代文字

Gle*_*len 9

因为语言设计师这么说.它真的很简单.这是一个惯例,他们强迫你遵循它.

  • 这简化了类加载. (3认同)

Pas*_*ent 8

引用部分7.6顶级类型声明Java语言规范:

当包存储在文件系统(第7.2.1节)中时,如果在由类型名称加上名称的文件中找不到类型,主机系统可以选择强制执行编译时错误的限制.如果满足以下任一条件,则为扩展名(例如.java.jav):

  • 该类型由声明类型的包的其他编译单元中的代码引用.
  • 声明了类型public(因此可以从其他包中的代码访问).

这种限制意味着每个编译单元最多只能有一个这样的类型.这种限制使得Java编程语言的编译器或Java虚拟机的实现很容易在包中找到命名类; 例如,公共类型的源代码wet.sprocket.Toad 可以在Toad.java 目录中的文件中找到,wet/sprocket相应的目标代码可以Toad.class在同一目录中的文件中找到.

当包存储在数据库 (第7.2.2节)中时,主机系统不得强加此类限制.实际上,许多程序员选择将每个类或接口类型放在它自己的编译单元中,无论它是公共的还是由其他编译单元中的代码引用.


ska*_*man 4

语言规范本身并没有规定这一点(我刚刚看了一下,没有找到任何参考),但它通常是由工具强制执行的。它使工具的依赖关系管理变得相当容易,因为如果类 A 引用了类 B,它就知道在哪里查找类 B。该约定扩展到与包结构相呼应的目录结构,但同样,这只是一个约定。

  • 它仍然是几乎所有编译器和工具强制执行的约定。这实际上使其成为一种语言限制,即使 JLS 没有规定。 (3认同)
  • 请参阅下面 Pascal Thivent 的回答;JLS 中**有**对此的引用。 (2认同)