javac n'interdit pas activement cela, mais il a une limitation qui signifie à peu près que vous ne voudriez jamais faire référence à une classe de niveau supérieur à partir d'un autre fichier à moins qu'elle ait le même nom que le fichier dans lequel elle se trouve.
Supposons que vous ayez deux fichiers, Foo.java et Bar.java.
Foo.java contient:
Bar.java contient:
- Bar public class
- classe Baz
Disons également que toutes les classes sont dans le même package (et les fichiers sont dans le même répertoire).
Que se passe-t-il si Foo.java fait référence à Baz mais pas à Bar et que nous essayons de compiler Foo.java? La compilation échoue avec une erreur comme celle-ci:
Foo.java:2: cannot find symbol
symbol : class Baz
location: class Foo
private Baz baz;
^
1 error
Cela a du sens si vous y réfléchissez. Si Foo.java fait référence à Baz, mais qu'il n'y a pas de Baz.java (ou Baz.class), comment javac peut-il savoir dans quel fichier source chercher?
Si vous dites à la place à javac de compiler Foo.java et Bar.java en même temps, ou même si vous aviez déjà compilé Bar.java (en laissant la Baz.class où javac peut le trouver), cette erreur disparaît. Cela rend cependant votre processus de construction très peu fiable et instable.
Parce que la limitation réelle, qui ressemble plus à «ne fait pas référence à une classe de niveau supérieur d'un autre fichier, sauf si elle a le même nom que le fichier dans lequel elle se trouve ou si vous faites également référence à une classe qui se trouve dans le même fichier nommé la même chose que le fichier "est un peu difficile à suivre, les gens adoptent généralement la convention beaucoup plus simple (bien que plus stricte) de ne mettre qu'une classe de niveau supérieur dans chaque fichier. C'est aussi mieux si jamais vous changez d'avis quant à savoir si une classe doit être publique ou non.
Parfois, il y a vraiment une bonne raison pour laquelle tout le monde fait quelque chose d'une manière particulière.