javac non lo proibisce attivamente, ma ha una limitazione che praticamente significa che non vorresti mai fare riferimento a una classe di livello superiore da un altro file a meno che non abbia lo stesso nome del file in cui si trova.
Supponiamo di avere due file, Foo.java e Bar.java.
Foo.java contiene:
Bar.java contiene:
- Bar di classe pubblica
- classe Baz
Diciamo anche che tutte le classi si trovano nello stesso pacchetto (e che i file si trovano nella stessa directory).
Cosa succede se Foo.java si riferisce a Baz ma non a Bar e proviamo a compilare Foo.java? La compilazione non riesce con un errore come questo:
Foo.java:2: cannot find symbol
symbol : class Baz
location: class Foo
private Baz baz;
^
1 error
Questo ha senso se ci pensi. Se Foo.java fa riferimento a Baz, ma non esiste Baz.java (o Baz.class), come può javac sapere in quale file sorgente cercare?
Se invece dici a javac di compilare Foo.java e Bar.java allo stesso tempo, o anche se avevi precedentemente compilato Bar.java (lasciando la classe Baz. dove javac può trovarlo), questo errore scompare. Questo rende il tuo processo di compilazione molto inaffidabile e traballante, tuttavia.
Perché la limitazione effettiva, che è più simile a "non si riferisce a una classe di livello superiore da un altro file a meno che non abbia lo stesso nome del file in cui si trova o si riferisca anche a una classe che si trova nello stesso file che è denominato la stessa cosa del file "è un po 'difficile da seguire, le persone di solito vanno con la convenzione molto più semplice (anche se più rigorosa) di mettere solo una classe di livello superiore in ciascun file. Questo è anche meglio se cambi idea sul fatto che una classe debba essere pubblica o meno.
A volte c'è davvero una buona ragione per cui tutti fanno qualcosa in un modo particolare.