答案 0 :(得分:9)
因为语言设计师这么说。它真的很简单。这是一个惯例,它们迫使你遵循它。
答案 1 :(得分:8)
从7.6 Top Level Type Declarations:
中引用Java Language Specification部分当包存储在文件中时 系统(§7.2.1),主机系统 可以选择执行限制 如果是一个编译时错误 在a下的文件中找不到类型 名称由类型名称加上一个组成 扩展名(例如
.java
或.jav
) 如果满足以下任一条件:
- 该类型由包的其他编译单元中的代码引用 其中声明了类型。
- 类型声明为
public
(因此可以访问 从其他包中的代码)。这种限制意味着那里 每个最多一个这样的类型 编译单位。这个限制 使编译器易于使用 Java编程语言或 Java虚拟的实现 机器在一个内部找到一个命名类 包;例如,源代码 对于公共类型
wet.sprocket.Toad
可以在文件Toad.java
中找到 在目录wet/sprocket
中,和 相应的对象代码将是 在文件Toad.class
中找到 同一目录。将包存储在数据库中时 (§7.2.2),主机系统必须 不要施加这样的限制。在 实践中,许多程序员选择 将每个类或接口类型放入 它自己的编译单元,无论是或 不是公开的或被提及的 其他编译单元中的代码。
答案 2 :(得分:4)
语言规范本身没有规定这个(我刚看过,并且没有找到它的引用),但它通常由工具强制执行。它使工具的依赖关系管理变得相当容易,因为如果A类引用了它,它知道在哪里查找B类。约定扩展到回显包结构的目录结构,但同样,这只是一个约定。
答案 3 :(得分:1)
如果我能改变世界,我希望c#设计师也这样做。 强迫人们不创建文件classes.cs并将所有代码放入其中可以节省多少时间。对于If,是不是要求括号。为什么语言迫使我做那个愚蠢的事情:
if (true)
{
}
而不是
if true
{
}
: - )