У меня есть файл Test.java
и следующий код внутри него.
public class Abcd
{
//some code here
}
Теперь класс не компилируется, но когда я удаляю public
модификатор, он компилируется нормально.
В чем причина того, что Java позволяет нам компилировать имя класса, которое отличается от имени файла, когда оно не является публичным.
Я знаю, что это вопрос новичка, но я не могу найти хорошего объяснения.
Ответы:
Обоснование заключается в том, чтобы разрешить более одного класса верхнего уровня на
.java
файл.Многие классы, такие как прослушиватели событий, имеют локальное использование, и самые ранние версии Java не поддерживали вложенные классы. Без этого ослабления правила «имя файла = имя класса» каждому такому классу потребовался бы собственный файл с неизбежным результатом бесконечного распространения небольших
.java
файлов и разброса тесно связанного кода.Как только Java представила вложенные классы, важность этого правила значительно уменьшилась. Сегодня вы можете просматривать сотни файлов Java, не выбирая тот, который использует его.
источник
Причина та же, что и для дверных табличек. Если какой-либо человек официально проживает в офисе (объявлен публичным), его / ее имя должно быть на дверной бирке. Как «Алекс Джонс» или «Детектив Коломбо». Если кто-то просто заходит в комнату, разговаривает с чиновником или убирает пол, его имя не обязательно должно быть официально указано на двери. Вместо этого на двери можно прочитать «Утилиты» или «Комната переговоров».
источник
Спецификация Java гласит, что вы можете иметь только один открытый класс на файл. В этом случае имя класса должно соответствовать имени файла. Все непубличные классы могут иметь любое имя независимо от имени файла.
источник
Я думаю, что разрешение их является обязательным условием для вложенных классов. В частности, анонимные классы значительно сокращают количество необходимых файлов .java. Без поддержки этого вам потребовалось бы множество реализаций интерфейса одного метода в их отдельных файлах от основного класса, в котором они используются. (Я имею в виду слушателей действия в частности)
Хорошее объяснение всех вложенных классов содержится в руководстве Java « Вложенные классы» на веб-сайте Oracle, в котором приведены примеры каждого из них. У этого также есть причина, они полезны, который я процитирую:
(акцент мой)
Я не был знаком с Java-спецификацией в ранние годы, но быстрый поиск показывает, что в Java 1.1 были добавлены внутренние классы.
источник
Я смотрю на это с другой стороны. Для программиста естественным было бы выбирать и имя класса, и имя файла независимо. Вероятно, чтобы упростить поиск открытых классов извне пакета во время компиляции, существует специальное ограничение, согласно которому открытый класс должен находиться в файле с соответствующим именем.
источник
Обратите внимание, что в Java учитывается регистр, но файловая система не обязательна. Если базовое имя файла - «abcd», а класс - «Abcd», будет ли это соответствовать правилу в файловой системе без учета регистра? Конечно, не при переносе на регистр.
Или предположим, что у вас есть класс с именем ABCD и класс Abcd (давайте не вдаваться в плохую идею: это может произойти), и программа портирована на нечувствительную к регистру файловую систему. Теперь вам нужно переименовывать не только файлы, но и классы, упс!
Или что если нет файла? Предположим, у вас есть компилятор Java, который может принимать входные данные при стандартном вводе. Так тогда класс должен быть назван "StandardInput"?
Если вы рационально исследуете, что имена файлов должны следовать за именами классов, вы обнаружите, что это плохая идея по нескольким причинам.
источник
Foo
было объявлено, идентификаторыFOO
,foo
,fOo
и т.д. бы все «не определены» , даже если бы они существовали в пределах внешних областей. Такой дизайн устранит проблему чувствительности к регистру имен файлов.Также еще один момент, на который многие пропущенные ответы указывают, заключается в том, что без
public
объявления JVM никогда не узнает, какой основной метод классов необходимо вызвать. Все классы, объявленные в одном файле .java, могут иметь методы main, но метод main запускается только для класса, помеченного как public. НТНисточник
Поскольку файл Java может содержать более одного класса, он может иметь два класса в одном файле Java. Но файл Java должен содержать класс с тем же именем, что и имя файла, если он содержит открытый класс.
источник