javac не забороняє цього активно, але у нього є обмеження, яке в значній мірі означає, що ви ніколи не хочете посилатися на клас вищого рівня з іншого файлу, якщо він не має того самого імені, що і файл, в якому він знаходиться.
Припустимо, у вас є два файли, Foo.java і Bar.java.
Foo.java містить:
Bar.java містить:
- Бар публічного класу
- клас Баз
Скажемо також, що всі класи знаходяться в одному пакеті (а файли - в одному каталозі).
Що станеться, якщо Foo.java посилається на Baz, але не на Bar, і ми спробуємо скласти Foo.java? Компіляція не вдається з такою помилкою:
Foo.java:2: cannot find symbol
symbol : class Baz
location: class Foo
private Baz baz;
^
1 error
Це має сенс, якщо ви подумаєте про це. Якщо Foo.java посилається на Baz, але немає Baz.java (або Baz.class), як javac може знати, у якому вихідному файлі шукати?
Якщо ви замість цього скажете javac одночасно збирати Foo.java і Bar.java або навіть якщо ви раніше компілювали Bar.java (залишаючи Baz.class, де javac може його знайти), ця помилка усувається. Однак це робить процес збирання дуже ненадійним та неохайним.
Тому що фактичне обмеження, яке більше нагадує "не посилайтесь на клас вищого рівня з іншого файлу, якщо він не має того самого імені, що і файл, у якому він є, або ви також посилаєтесь на клас, який знаходиться в тому самому файлі, який названий те саме, що за файлом "важко дотримуватися, люди зазвичай йдуть із набагато простішою (хоча суворішою) умовою просто введення одного класу верхнього рівня у кожен файл. Це також краще, якщо ви коли-небудь передумаєте, чи має бути клас загальнодоступним чи ні.
Іноді дійсно є вагома причина, чому кожен робить щось певним чином.