O javac não proíbe isso ativamente, mas tem uma limitação que praticamente significa que você nunca desejaria consultar uma classe de nível superior de outro arquivo, a menos que tenha o mesmo nome do arquivo em que está.
Suponha que você tenha dois arquivos, Foo.java e Bar.java.
Foo.java contém:
Bar.java contém:
- Bar de classe pública
- classe Baz
Digamos também que todas as classes estão no mesmo pacote (e os arquivos estão no mesmo diretório).
O que acontece se Foo.java se referir a Baz, mas não Bar, e tentarmos compilar Foo.java? A compilação falha com um erro como este:
Foo.java:2: cannot find symbol
symbol : class Baz
location: class Foo
private Baz baz;
^
1 error
Isso faz sentido se você pensar sobre isso. Se Foo.java se referir ao Baz, mas não houver Baz.java (ou Baz.class), como o javac pode saber em qual arquivo de origem procurar?
Se você instruir o javac a compilar Foo.java e Bar.java ao mesmo tempo, ou mesmo se você tiver compilado o Bar.java anteriormente (deixando a classe Baz.classe onde o javac pode encontrá-lo), esse erro desaparecerá. Isso faz com que seu processo de construção pareça muito pouco confiável e esquisito.
Como a limitação real, que é mais parecida com "não se refere a uma classe de nível superior de outro arquivo, a menos que tenha o mesmo nome do arquivo em que está ou você também esteja se referindo a uma classe que está no mesmo arquivo que é nomeado a mesma coisa que o arquivo "é meio difícil de seguir, as pessoas geralmente seguem a convenção muito mais direta (embora mais rigorosa) de apenas colocar uma classe de nível superior em cada arquivo. Isso também é melhor se você mudar de idéia sobre se uma classe deve ser pública ou não.
Às vezes, há realmente uma boa razão pela qual todo mundo faz algo de uma maneira específica.