Ну, на самом деле это необязательное ограничение в соответствии со спецификацией языка Java (раздел 7.6, стр. № 209), но за ним следует компилятор Oracle Java в качестве обязательного ограничения. Согласно спецификации языка Java,
Когда пакеты хранятся в файловой системе (§7.2.1), система хоста
может выбрать принудительное ограничение, что это ошибка времени компиляции
если тип не найден в файле с именем, состоящим из типа
имя плюс расширение (например, .java или .jav), если любой из
верно следующее:
- На тип ссылается код в других единицах компиляции пакета, в котором объявлен тип.
- Тип объявлен как открытый (и поэтому потенциально доступен из кода в других пакетах).
Это ограничение подразумевает, что не более одного такого типа в
блок компиляции. Это ограничение облегчает компиляцию Java
найти именованный класс в пакете.
На практике многие программисты выбирают каждый класс или интерфейс
введите свой собственный модуль компиляции, является ли он общедоступным или
упоминается кодом в других единицах компиляции.
Например, исходный код для открытого типа wet.sprocket.Toad будет
найти в файле Toad.java в каталоге wet / sprocket, а
соответствующий объектный код будет найден в файле Toad.class в
тот же каталог.
Чтобы получить более ясную картину, давайте представим, что в одном и том же исходном файле есть два открытых класса: публичный класс A и публичный класс B, а класс A имеет ссылку на еще не скомпилированный класс B. И мы компилируем (compiling-linking-loading ) класс A теперь, когда ссылка на компилятор класса B будет вынуждена проверять каждый файл * .java в текущем пакете, потому что класс B не имеет своего конкретного файла B.java. Таким образом, в приведенном выше случае компилятору требуется немного времени, чтобы найти, какой класс находится в каком исходном файле и в каком классе лежит основной метод.
Таким образом, причина сохранения одного общедоступного класса на исходный файл состоит в том, чтобы фактически ускорить процесс компиляции, поскольку он позволяет более эффективно искать исходные и скомпилированные файлы во время компоновки (операторы импорта). Идея в том, что если вы знаете имя класса, вы знаете, где его нужно найти для каждой записи пути к классу, и индексация не требуется.
А также, как только мы выполняем наше приложение, JVM по умолчанию ищет открытый класс (поскольку нет ограничений и может быть доступен из любого места), а также ищет public static void main(String args[])
в этом открытом классе. Открытый класс действует как начальный класс, с которого начинается экземпляр JVM для приложения (программы) Java. Поэтому, когда мы предоставляем более одного открытого класса в программе, компилятор сам останавливает вас, выдавая ошибку. Это потому, что позже мы не можем спутать JVM с тем, какой класс должен быть его начальным классом, потому что только один открытый класс с public static void main(String args[])
является начальным классом для JVM.
Подробнее о можно узнать, почему один исходный файл Java не может иметь более одного открытого класса