Один из моих детей учится на Java в старшей школе, и у него было одно из его испытаний:
Что из следующего является допустимым идентификатором в Java?
а.
123java
б.main
с.java1234
д.{abce
е.)whoot
Он ответил б и ошибся.
Я посмотрел на этот вопрос и утверждал , что main
является допустимым идентификатором , и что он должен был прав.
Мы взглянули на спецификацию Java для идентификаторов, и она подтвердила эту точку зрения. Мы также написали пример программы, в которой была названа переменная main
и метод. Он создал письменное опровержение, включающее ссылку на документацию по Java, тестовую программу, и учитель проигнорировал ее и сказал, что ответ по-прежнему неверен.
Является main
действительным идентификатором?
java
language-lawyer
main
identifier
Гари Бак
источник
источник
Ответы:
Это компилирует, и когда выполнено, испускает этот вывод:
Последовательность символов
main
- это идентификатор, а не ключевое слово или зарезервированное слово.Соответствующий раздел JLS является 3,8 :
Последовательность символов
main
соответствует приведенному выше описанию и отсутствует в списке ключевых слов в разделе 3.9 .(Последовательность символов
java1234
также является идентификатором по тем же причинам.)источник
main
;)main
является допустимым идентификатором Java, и учитель не прав.Соответствующая документация находится в Спецификации языка Java, прямо здесь:
Глава 3. «Лексическая структура», раздел 3.8. «Идентификаторы»:
https://docs.oracle.com/javase/specs/jls/se10/html/jls-3.html#jls-3.8
Это говорит:
Это означает, что вы можете доказать, что это действительный идентификатор, либо:
источник
Как говорится в других ответах
main
является допустимым идентификатором Java , а такжеjava1234
.Я предполагаю, что сбивает с толку тот факт, что
main(String[])
метод часто используется в качестве точки входа в JVM 1 . Однако это не означает, что сам токенmain
не может быть использован как идентификатор 2 .Спецификации говорят так, и следующие объявления также действительны:
Поле:
Локальная переменная:
Метод:
Класс (хотя имя класса, начинающееся со строчной буквы, не рекомендуется):
Пакет:
1: Как отмечено в комментариях, сама спецификация JVM не требует какого-либо конкретного метода в качестве точки входа, но широко используемый
java
инструмент часто использует такой метод в качестве точки входа.2: я вообще избегал бы создания основного метода кроме
main(String[])
.источник
main
не является точкой входа для JVM. Это точка входа, которуюjava
инструмент использует для запуска приложений. Другие инструменты (например, контейнеры сервлетов) используют другие точки входа.java
Инструмент не требуетmain(String[])
метода , если основной класс расширяет javafx.application.Application .Это прекрасно компилируется на Java 1.8 ...
... и при выполнении выдает результат:
источник
static main
метод с другими параметрами?package main;
!Я бросил все, что мог, на это, и это, кажется, работает. Я бы сказал, что main является действительным идентификатором.
источник
public static void main(main...Main)
( пропуская пробел ) не может работать, не так ли?Как
main
нельзя использовать в качестве идентификатора, в то время как он используется в качестве идентификатора для объявления «основного» метода?Для такой классической идиомы:
main
не является ключевым словом и, вероятно, никогда не будет ключевым словом в Java по очевидным причинам ретро-совместимости.О вопросе,
main
хороший идентификатор?Во-первых: допустимо для компилятора не обязательно значит хорошо.
Например
java1234
, предложенная опция также является допустимым идентификатором, но этого действительно следует избегать.main
имеет очень конкретное и важное значение: он используется в качестве метода точки входа для классов и jar-файлов, выполняемыхjava
командной строкой.Использование
main
имени метода, которое не соответствует критериям, которые будут использоватьсяjava
командной строкой, будет просто вводить в заблуждение, хотя его использование в качестве имени переменной или имени класса может иметь смысл.Например,
Main
приемлемо определение класса, представляющего точку входа приложения в качестве класса приложения, и использование его в качестве имени переменной, например:Как правило, в Java несколько символов или «слов» считаются допустимыми идентификаторами для компилятора, но настоятельно не рекомендуется использовать их в клиентском коде (но сгенерированный код может сделать это: например, вложенные классы) как не читаемые и / или действительно вводит в заблуждение.
Например, это может быть допустимо для компилятора:
Но мы не хотим:
Object
наш класс, как это определено вjava.lang
(1).main()
если он не заполняет критерии, которые будут использоватьсяjava
командной строкой (2).Object.toString()
метод (3)._
,$
или любыми неожиданными / unmeaningful символов , которые идут против общих соглашений об именах (4).источник
main
может быть ключевое слово, которое можно использовать только в качестве имени для статического метода с соответствующей сигнатурой (или как угодно). Обратите внимание, что вызовы суперкласса используютsuper
таким образом, что он выглядит как идентификатор:super(foo);
иsuper.foo
, ноsuper
является ключевым словом (и до того, как были добавлены дженерики, это был единственный способ его использовать (что я помню)).main
ключевое слово в новой версии Java, это означает, что любой код, который использует main в качестве имени метода (или любые имена членов), больше не будет компилироваться. Использованиеsuper
in generics не имеет побочных эффектов в существующем коде, поскольку generics не существовало в настоящее время.main
это все же лучший идентификатор, чемjava1234
. Использование его для «обычного» метода будет вводить в заблуждение, но у меня не будет проблем с именованием переменнойmain
, если это на самом деле главное в моем методе.java1234
просто ужасно, имена должны быть описательными ...main
если бы функция, на которую я смотрел, что-то делала с данными по водопроводу. Я бы бросил, если бы я когда-либо виделjava1234
в производственном коде (и молюсь, что не было 1233 других переменных с префиксомjava
).Это действительный идентификатор? Да.
Это хороший идентификатор? Нет, если вы используете его для чего-то другого, кроме метода, который запускается при запуске JVM.
В списке есть еще один действительный идентификатор? Да.
В инструкциях по тестированию сказано, чтобы выбрать лучший ответ?
источник
main
допустимый идентификатор можетjava1234
быть выше, чем в случае. Рассмотрим, например, кодовую базу, работающую с данными по водоснабжению (водопровод).main
является идеальным идентификатором за пределами узкой области простого Java-приложения. Это может быть имя поля в классе, представляющее заданное меню. Или<main>
раздел документа в конструкторе HTML.java1234
с другой стороны, это так же ужасно, как и идентификаторы.main
совершенно верно, потому что это, из документов :источник
источник
Этот учитель допустил небольшую ошибку, предполагая, что main не является допустимым идентификатором, или просто неправильно формулирует вопрос. Возможно, он хотел сказать «хороший идентификатор».
Но игнорирование аргументов ваших сыновей и, таким образом, препятствование его научному подходу проверки соответствующей литературы (спецификации Java) и проведения эксперимента (написания примера программы) является полной противоположностью того, что должен делать учитель.
источник
main
гораздо чаще «хороший» идентификатор, чемjava1234
был бы. Так что даже там учитель не прав. ;)Оба
main
иjava123
являются действительными идентификаторами, main не является зарезервированным ключевым словом, поэтому его вполне приемлемо использовать, поскольку в ходе теста вы должны были получить хотя бы одно очко или пол-очка.источник
Должно быть одно слово. То есть пробелы не допускаются.
Пример: mangoprice действителен, но цена манго недействительна.
Должен начинаться с буквы (алфавита) или подчеркивания или символа $.
Пример: цена, _price и $ цена являются действительными идентификаторами.
Не должно быть ключевым словом Java, поскольку ключевое слово несет особое значение для компилятора.
Пример: класс или пустота и т. Д.
Не должен начинаться с цифры, но цифра может быть в середине или в конце.
Пример: 5mangoescost недействителен, а mango5cost и mangocost5 действительны.
Длина идентификатора в Java может составлять 65 535 символов, и все они являются значительными. Идентификаторы чувствительны к регистру. То есть и к манго, и к манго относятся по-разному. Может содержать все заглавные буквы или строчные буквы или смесь.
ИДЕНТИФИКАТОР : это имена классов, имена методов, имена переменных ...
Так как main не является зарезервированным словом и в соответствии с объяснением выше для определения идентификатора main является допустимым идентификатором, а также java1234. Остальные опции недопустимы из-за вышеприведенного пояснения.
источник