javac no prohíbe esto activamente, pero tiene una limitación que significa que nunca querrá referirse a una clase de nivel superior de otro archivo a menos que tenga el mismo nombre que el archivo en el que se encuentra.
Supongamos que tiene dos archivos, Foo.java y Bar.java.
Foo.java contiene:
Bar.java contiene:
- Bar de clase pública
- clase Baz
Digamos también que todas las clases están en el mismo paquete (y los archivos están en el mismo directorio).
¿Qué sucede si Foo.java se refiere a Baz pero no a Bar e intentamos compilar Foo.java? La compilación falla con un error como este:
Foo.java:2: cannot find symbol
symbol : class Baz
location: class Foo
private Baz baz;
^
1 error
Esto tiene sentido si lo piensas. Si Foo.java se refiere a Baz, pero no hay Baz.java (o Baz.class), ¿cómo puede saber javac en qué archivo fuente buscar?
Si, en cambio, le dice a javac que compile Foo.java y Bar.java al mismo tiempo, o incluso si previamente compiló Bar.java (dejando la clase Baz.class donde javac puede encontrarlo), entonces este error desaparece. Sin embargo, esto hace que su proceso de construcción se sienta muy poco confiable y poco fiable.
Debido a que la limitación real, que es más como "no se refiere a una clase de nivel superior de otro archivo a menos que tenga el mismo nombre que el archivo en el que se encuentra o que también se refiera a una clase que está en ese mismo archivo que se llama lo mismo que el archivo "es un poco difícil de seguir, la gente suele seguir la convención mucho más directa (aunque más estricta) de simplemente poner una clase de nivel superior en cada archivo. Esto también es mejor si alguna vez cambia de opinión acerca de si una clase debe ser pública o no.
A veces hay una buena razón por la cual todos hacen algo de una manera particular.