javac没有主动禁止这一点,但它确实有一个限制,几乎意味着你永远不想从另一个文件引用顶级类,除非它与它所在的文件具有相同的名称 .
假设您有两个文件,Foo.java和Bar.java .
Foo.java包含:
公共课Foo
Bar.java包含:
公共类酒吧
class Baz
我们还要说所有类都在同一个包中(并且这些文件位于同一目录中) .
如果Foo.java引用Baz而不是Bar并且我们尝试编译Foo.java会发生什么?编译失败,出现如下错误:
Foo.java:2: cannot find symbol
symbol : class Baz
location: class Foo
private Baz baz;
^
1 error
如果你考虑一下,这是有道理的 . 如果Foo.java引用了Baz,但是没有Baz.java(或Baz.class),javac怎么知道要查看哪个源文件?
如果您改为告诉javac同时编译Foo.java和Bar.java,或者即使您之前编译过Bar.java(留下了javac可以找到它的Baz.class),那么这个错误就会消失 . 但是,这会使您的构建过程感觉非常不可靠和不稳定 .
因为实际的限制,更像是“不要从另一个文件引用顶级类,除非它与它所在的文件具有相同的名称,或者你也指的是同一个文件中的一个类名称与文件“有点难以理解的东西相同,人们通常会选择在每个文件中放置一个顶级类的更简单(尽管更严格)的约定 . 如果您改变主意是否应该公开课程,这也会更好 .
有时,每个人都以某种特定的方式做某事真的有充分的理由 .