Как связаны имя java-файла и классы, объявленные в этом файле

Обновлено: 30.06.2024

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

IntelliJ IDEA предоставляет предопределенные шаблоны для всех поддерживаемых типов файлов, предлагаемых при создании нового файла. Набор предлагаемых типов файлов зависит от модуля и конфигурации, а также от свойств вашего текущего местоположения в окне инструментов проекта. Например, IntelliJ IDEA не предложит создать файл класса Java за пределами исходных или тестовых каталогов Java. Дополнительную информацию см. в разделе Корни содержания.

Например, если щелкнуть правой кнопкой мыши каталог в окне инструмента "Проект" и выбрать "Создать", вы увидите список файлов, которые можно создать в этом контексте. Эти файлы имеют соответствующие шаблоны файлов, настроенные в настройках.

Список шаблонов файлов при создании новый файл

Управление и настройка шаблонов файлов

Нажмите Ctrl+Alt+S, чтобы открыть настройки IDE, и выберите Редактор | Шаблоны файлов и кода .

По умолчанию список шаблонов содержит только предварительно определенные шаблоны, предоставленные IntelliJ IDEA. Некоторые из них являются внутренними, что означает, что их нельзя удалить или переименовать. IntelliJ IDEA показывает имена внутренних шаблонов жирным шрифтом. Имена измененных вами шаблонов, а также пользовательских шаблонов, созданных вручную, отображаются синим цветом.

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

Создать новый шаблон файла

Нажмите Ctrl+Alt+S, чтобы открыть настройки IDE, и выберите Редактор | Шаблоны файлов и кода .

На вкладке "Файлы" нажмите и укажите имя, расширение файла и текст шаблона.

Примените изменения и закройте диалоговое окно.

Скопировать существующий шаблон файла

Нажмите Ctrl+Alt+S, чтобы открыть настройки IDE, и выберите Редактор | Шаблоны файлов и кода .

На вкладке "Файлы" щелкните и при необходимости измените имя, расширение файла и текст шаблона.

Примените изменения и закройте диалоговое окно.

Сохранить файл как шаблон

Откройте файл в редакторе.

В главном меню выберите Файл | Сохранить файл как шаблон .

В диалоговом окне "Сохранить файл как шаблон" укажите имя нового шаблона и при необходимости отредактируйте текст.

Примените изменения и закройте диалоговое окно.

Синтаксис

Шаблоны файлов используют язык шаблонов Velocity (VTL), который включает следующие конструкции:

Обычный текст отображается как есть.

Переменные, которые заменяются своими значениями. Например, $ вставляет имя, указанное пользователем при добавлении файла.

Дополнительную информацию см. в справочном руководстве по VTL.

В следующем примере показан шаблон по умолчанию для создания класса Java в IntelliJ IDEA:

В этом шаблоне:

Затем шаблон объявляет общедоступный класс с именем, переданным в качестве переменной $ (имя нового файла).

При создании нового файла Java этот шаблон создает файл со следующим содержимым:

Учебники и публикации о Java, Spring, Hadoop и многом другом. Примеры кода Java и вопросы для интервью. Примеры кода Spring.

Четверг, 9 сентября 2021 г.

Почему имя класса и имя файла должны совпадать в Java

  • Имя файла и имя класса в Java должны совпадать.
  • Подпись основного метода. Подпись основного метода должна быть public static void main(String[] args)

См. раздел Почему метод main static в Java, чтобы понять требование, почему метод main должен быть статическим.

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

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

Имя файла и имя класса совпадают в Java — общедоступный класс

Давайте рассмотрим случай, когда у нас есть публичный класс.

Если мы сохраним его как Thetest.java, мы получим ошибку при попытке его компиляции.

Можно увидеть, как компилятор жалуется на открытый класс Test и на то, что он должен быть объявлен как Test.java.

Теперь, если мы сохраним класс как Test.java, он компилируется и работает нормально.

Имя файла и имя класса в Java совпадают — без открытого класса

Теперь давайте возьмем пример, когда нет общедоступного класса-

У меня есть этот файл с двумя классами, и ни один из них не является общедоступным, теперь я могу сохранить его, дав любое имя, скажем, я сохранил его как ABC.java. Да, это возможно, если нет класса с модификатором доступа как общедоступного. Но это только половина правды! Когда этот java-файл скомпилирован, он создаст 2 класса —

Видно, что даже если имя файла отличается, скомпилированные классы имеют то же имя, что и имена классов.

Теперь, если нам нужно запустить его, мы должны использовать-

демонстрация финального класса Java

Это показывает, что во время компиляции имя файла может отличаться от имени класса в Java (при условии, что в файле нет общедоступного класса), но во время выполнения оно должно совпадать.< /p>

Почему эти ограничения

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

Давайте рассмотрим это на примере, предположим, у меня есть файл Java следующим образом:

Здесь у нас есть один общедоступный класс Test и два других класса Test1 и Test2, имеющие доступ по умолчанию. Теперь предположим, что у нас нет ограничения на сохранение этого файла как Test.java (имя открытого класса). Итак, вы сохранили его как ABC.java. Теперь во время компиляции (javac ABC.java) компилятор должен сканировать всю файловую структуру, чтобы найти общедоступный класс, который, безусловно, является накладным, и его легко избежать, сохранив файл Java как Test.java.

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

Давайте еще раз попытаемся понять это на примере–

Допустим, у меня есть один класс Test1 с доступом по умолчанию, и я сохранил его как XYZ.java–

И еще один класс, в котором создается объект класса Test1.

В этом классе при создании объекта класса Test1 вы используете имя класса (Test1 t = new Test1();), а не сохраненное имя файла (XYZ.java).

Test будет искать файл .class Test1, когда ему нужно загрузить класс Test1. Если файл .class также не будет иметь то же имя, что и класс, то JVM должна поддерживать некоторую внутреннюю структуру, чтобы иметь это сопоставление из сохраненного имени файла в имя класса и ссылаться на это сопоставление каждый раз, чтобы загрузить правильный класс. Это опять-таки накладные расходы, поэтому лучше иметь простое решение для создания по крайней мере файла .class с тем же именем, что и имя класса, даже в случае класса, который не является общедоступным.

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

  • Если открытого класса нет, имя файла может отличаться от имени класса в Java.
  • В случае наличия общедоступного класса необходимо, чтобы имя файла совпадало с именем общедоступного класса.
  • Даже в том случае, если имя файла отличается, после компиляции файлы .class имеют то же имя, что и имена классов.
  • Имя, совпадающее с именем класса, позволяет JVM узнать, какой класс загрузить и где искать точку входа (основной метод).

Рекомендации по обучению (курсы Udemy)

Это все, что касается этой темы Почему имя класса и имя файла должны совпадать в Java. Если у вас есть какие-либо сомнения или какие-либо предложения, пожалуйста, оставьте комментарий. Спасибо!

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

Поместите исходный код класса, интерфейса, перечисления или типа аннотации в текстовый файл, имя которого является простым именем типа и имеет расширение .java . Например:

Затем поместите исходный файл в каталог, имя которого отражает имя пакета, к которому принадлежит тип:

Полное имя члена пакета и путь к файлу параллельны, если предположить, что в качестве разделителя имен файлов Microsoft Windows используется обратная косая черта (для UNIX используйте прямую косую черту).

  • имя класса — graphics.Rectangle
  • путь к файлу — graphics\Rectangle.java

При компиляции исходного файла компилятор создает отдельный выходной файл для каждого определенного в нем типа. Базовое имя выходного файла — это имя типа, а его расширение — .class. Например, если исходный файл выглядит так

тогда скомпилированные файлы будут расположены по адресу:

Как и исходные файлы .java, скомпилированные файлы .class должны находиться в ряде каталогов, соответствующих имени пакета. Однако путь к .class не обязательно должен совпадать с путем к исходным файлам .java. Вы можете упорядочить каталоги исходного кода и классов отдельно, например:

Сделав это, вы можете передать каталог классов другим программистам, не раскрывая свои источники. Вам также необходимо управлять исходными файлами и файлами классов таким образом, чтобы компилятор и виртуальная машина Java (JVM) могли найти все типы, которые использует ваша программа.

Полный путь к каталогу классов,

\classes , называется путь к классу и задается системной переменной CLASSPATH. И компилятор, и JVM создают путь к вашим файлам .class, добавляя имя пакета к пути к классу. Например, если

это ваш путь к классу, а имя пакета

затем компилятор и JVM ищут файлы .class в

Путь к классу может включать несколько путей, разделенных точкой с запятой (Windows) или двоеточием (UNIX). По умолчанию компилятор и JVM выполняют поиск в текущем каталоге и файле JAR, содержащем классы платформы Java, так что эти каталоги автоматически находятся в вашем пути к классам.

Установка системной переменной CLASSPATH

Чтобы отобразить текущую переменную CLASSPATH, используйте следующие команды в Windows и UNIX (оболочка Bourne):

Чтобы удалить текущее содержимое переменной CLASSPATH, используйте следующие команды:

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

<р>1). Рассмотрим следующую программу.

Именование: Вы можете сохранить эту программу под любым именем. Это может быть ClassOne.java, ClassTwo.java или что угодно.java.

Компиляция. Вы должны скомпилировать эту программу с именем, которое вы дали, например >javac ClassOne.java или >javac ClassTwo.java или >javac any.java.

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

Выполняется. Это означает, что для вышеуказанной программы будут созданы два файла .class. Тогда какой бежать? это >java ClassOne или это >java ClassTwo….. Это должно быть >java ClassOne, потому что выполнение любой Java-программы начинается с метода main(). Если вы попытаетесь запустить >java ClassTwo, вы получите сообщение об ошибке: Основной метод не найден в классе ClassTwo, определите основной метод как public static void main(String[] args).

2). Теперь рассмотрим тот же пример с небольшими изменениями, просто объявите ClassOne общедоступным.

Именование: имя вышеупомянутого java-файла должно быть и только «ClassOne.java». Вы не можете назвать другое имя. Если вы укажете любое другое имя, вы получите ошибку времени компиляции: класс ClassOne является общедоступным, его следует объявить в файле с именем ClassOne.java.

Компиляция: здесь разрешено только одно имя, поэтому вы должны компилировать с этим именем, т.е. >javac ClassOne.java.

Работает: это должно быть >java ClassOne. потому что это единственный класс, который имеет метод main().

3). Теперь сделайте еще немного изменений в программе. Объявите ClassTwo общедоступным, а ClassOne — по умолчанию.

Именование: Вы должны сохранить этот файл с именем «ClassTwo.java». Если вы укажете любое другое имя, вы получите ошибку времени компиляции, потому что ClassTwo является общедоступным.

Компилировать: должен быть >javac ClassTwo.java.

Запуск: Вы должны назвать эту программу как ClassTwo.java, вы должны скомпилировать эту программу как >javac ClassTwo.java, но вы должны запустить ее как >java ClassOne, а не как >java ClassTwo. Потому что только ClassOne имеет метод main(). ClassTwo не имеет метода main(). Если вы запустите его как> java ClassTwo, вы получите ошибку времени выполнения: основной метод не найден в классе ClassTwo, определите основной метод как public static void main(String[] args).

4). Теперь сделайте еще немного изменений в программе. Объявите оба класса общедоступными.

Именование: какое бы имя вы ни дали, будь то ClassOne.java, ClassTwo.java или что-то еще.java, вы получите ошибку времени компиляции. Т.к. один java файл должен содержать только один или нулевой публичный класс. Он не должен содержать более одного общедоступного класса.

5) Посмотрите на следующую программу.

Именование: Вы можете сохранить эту программу под любым именем. Это может быть ClassOne.java, ClassTwo.java или any.java, так как общедоступного класса нет.

Компиляция. Вы должны скомпилировать эту программу с заданным вами именем, например >javac ClassOne.java или >javac ClassTwo.java или >javac any.java.

Выполнение: обратите внимание, что оба класса имеют метод main(). Вы можете запустить оба класса с их именем. т. е. если вы активируете> java ClassOne, вы получите From Class One в качестве вывода. Если вы активируете >java ClassTwo, вы получите From Class Two в качестве вывода.

Читайте также: