javac n'est pas activement l'interdire, mais il a une limitation qui signifie en gros que vous ne voudrais jamais de se référer à un haut-niveau de la classe à partir d'un autre fichier, sauf si il a le même nom que le fichier est en.
Supposons que vous avez deux fichiers Foo.java et Bar.java.
Foo.java contient:
Bar.java contient:
- public class Bar
- classe Baz
Disons aussi que toutes les classes sont dans le même package (et les fichiers sont dans le même répertoire).
Ce qui se passe si Foo.java se réfère à Baz, mais pas la Barre et nous essayons de compiler Foo.java? La compilation échoue avec un message d'erreur comme ceci:
Foo.java:2: cannot find symbol
symbol : class Baz
location: class Foo
private Baz baz;
^
1 error
Cela a un sens si vous pensez à ce sujet. Si Foo.java se réfère à Baz, mais il n'y a pas de Baz.java (ou Baz.class), comment peut-javac savoir ce fichier source pour look?
Si vous au lieu de dire javac pour compiler Foo.java et Bar.java en même temps, ou même si vous avez déjà compilé Bar.java (en laissant le Baz.class où javac pouvez le trouver) ce message d'erreur disparaît. Cela rend votre processus de construction de sens très fiable et squameuse, cependant.
Parce que la vraie limitation, qui est plus proche de "ne pas se référer à un haut-niveau de la classe à partir d'un autre fichier, sauf si il a le même nom que le fichier c'est ou vous êtes également en se référant à une classe qui est dans le même fichier nommé la même chose que le fichier" est assez difficile à suivre, les gens vont habituellement avec le plus simple (plus strict) de la convention de simplement mettre un haut-niveau de la classe dans chaque fichier. C'est mieux aussi si jamais vous changez d'avis quant à savoir si une classe doit être publique ou non.
Parfois, il y a vraiment une bonne raison pourquoi tout le monde fait quelque chose d'une manière particulière.