Почему Java позволяет нам скомпилировать класс с именем, отличным от имени файла?

У меня есть файл Test.java и следующий код внутри него.

public class Abcd
{
        //some code here

}

Теперь класс не компилируется, но когда я удаляю модификатор public, он компилируется отлично.

Какова аргументация Java, позволяющая нам скомпилировать имя класса, отличное от имени файла, когда оно не является общедоступным.

Я знаю, что это вопрос новичков, но я не могу найти хорошее объяснение.

Ответ 1

Обоснование состоит в том, чтобы разрешить более одного класса верхнего уровня для каждого файла .java.

Многие классы, такие как прослушиватели событий и mdash, имеют только локальное использование, а самые ранние версии Java не поддерживают вложенные классы. Без этой релаксации правила "имя_файла = класса" каждый такой класс потребовал бы свой собственный файл с неизбежным результатом бесконечного распространения небольших файлов .java и рассеяния тесно связанного кода.

Как только Java ввел вложенные классы, важность этого правила значительно ослабела. Сегодня вы можете пройти через сотни сотен Java файлов, никогда не зацикливаясь на том, что использует его.

Ответ 2

Причина та же, что и для дверных плит. Если какой-либо человек официально проживает в офисе (объявляется публичным), его/ее имя должно быть на этикетке двери. Как "Алекс Джонс" или "Детектив Коломбо". Если кто-то просто посещает комнату, разговаривает с официальным лицом или очищает пол, их имя не обязательно должно быть официально помещено в дверь. Вместо этого дверь может читать "Утилиты" или "Комната для переговоров".

Official name or MyClass.javaMeeting room or Test.java

Ответ 3

В спецификации Java указано, что вы можете иметь не более одного открытого класса для каждого файла. В этом случае имя класса должно совпадать с именем файла. Все непубличные классы могут иметь любое имя, независимо от имени файла.

Ответ 4

Я думаю, что их разрешение является предпосылкой для вложенных классов. Анонимные классы, в частности, значительно уменьшают количество требуемых файлов .java. Без поддержки для этого вам понадобится много реализаций интерфейса одного метода в их собственных отдельных файлах из основного класса, в котором они используются. (Я думаю о действиях в частности)

Существует хорошее объяснение всех вложенных классов в Вложенные классы Учебник Java на веб-сайте Oracle, в котором есть примеры каждого из них. У него также есть причина, по которой они полезны, что я приведу:

Зачем использовать вложенные классы?

Принудительные причины использования вложенных классов включают следующее:

  • Это способ логически группировать классы, которые используются только в одном месте. Если класс полезен только для одного другого класса, то логично вставлять его в этот класс и держите их вместе. Вложение таких "вспомогательных классов" делает их пакет более упорядоченным.

  • Он увеличивает инкапсуляцию. Рассмотрим два класса верхнего уровня: A и B, где B требуется доступ к членам A, которые в противном случае были бы объявлено частным. Скрывая класс B в классе A, члены A могут быть объявленные частными, а B - к ним. Кроме того, сам B может быть скрытый от внешнего мира.

  • Это может привести к более легко читаемому и поддерживаемому коду. Вложенные небольшие классы в классах верхнего уровня помещают код ближе к месту б.

(акцент мой)

Я не знаком с Java spec еще в ранние дни, но быстрый поиск показывает, что внутренние классы были добавлены в Java 1.1.

Ответ 5

Я смотрю на это наоборот. Естественное состояние дел было бы для программиста самостоятельно выбирать имя класса и имя файла. Вероятно, чтобы упростить поиск открытых классов извне пакета во время компиляции, существует специальное ограничение того, что открытый класс будет в файле с соответствующим именем.

Ответ 6

Обратите внимание, что Java чувствителен к регистру, но файловой системы не обязательно. Если базовое имя файла - "abcd", но класс - "Abcd", соответствует ли это правилу файловой системе без учета регистра? Конечно, не при переносе на чувствительный к регистру.

Или предположим, что у вас был класс ABCD, и класс Abcd (пусть не попадает в то, что это плохая идея: это может произойти), и программа переносится на файловую систему без регистра. Теперь вам не только нужно переименовывать файлы, но и классы, oops!

Или что, если нет файла? Предположим, у вас есть компилятор Java, который может принимать входные данные на стандартном входе. Итак, класс должен быть назван "StandardInput"?

Если вы разумно исследуете последствия того, что имена файлов должны следовать за именами классов, вы обнаружите, что это плохая идея более чем одним способом.

Ответ 7

Кроме того, еще один момент, на который пропущено много ответов, заключается в том, что без объявления public JVM никогда не узнает, какой основной метод классов необходимо вызвать. Все классы, объявленные в одном .java файле, могут иметь основные методы, но основной метод выполняется только для класса, помеченного как public. НТН

Ответ 8

Из-за того, что java файл может содержать более одного класса, он может иметь два класса в одном java файле. Но java файл должен содержать класс как то же имя, что и имя файла, если он содержит открытый класс.