Является основным допустимым идентификатором Java?

Один из моих детей принимает Java в старшей школе и получил это на одном из своих тестов:

Какое из следующих значений является допустимым идентификатором в Java?

а. 123java
б. main
с. java1234
д. {abce
е. )whoot

Он ответил b и сделал это неправильно.

Я рассмотрел этот вопрос и утверждал, что main является допустимым идентификатором и что он должен быть прав.

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

Является ли main действительным идентификатором?

Ответы

Ответ 1

public class J {
    public static void main(String[] args)
    {
        String main = "The character sequence \"main\" is an identifier, not a keyword or reserved word.";
        System.out.println(main);
    }
}

Этот компилятор, и при выполнении, испускает этот вывод:

The character sequence "main" is an identifier, not a keyword or reserved word.

Последовательность символов main является идентификатором, а не ключевое слово или зарезервированное слово.

Соответствующий раздел JLS составляет 3,8:

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

Идентификатор:

Идентификационные символы, но не ключевое слово или логическое значение BooleanLiteral или NullLiteral

IdentifierChars:

JavaLetter {JavaLetterOrDigit}

JavaLetter:

любой символ Юникода, который является "буквой Java",

JavaLetterOrDigit:

любой символ Юникода, который является "буквой или цифрой Java",

Последовательность символов main подходит выше описание и не в списке ключевых слов в разделе 3.9.

(Последовательность символов java1234 также является идентификатором по тем же причинам.)

Ответ 2

main - это действительный идентификатор Java, и учитель ошибается.

Соответствующая документация находится в Спецификации языка Java, прямо здесь:

Глава 3. "Лексическая структура", раздел 3.8. "Идентификаторы":

https://docs.oracle.com/javase/specs/jls/se10/html/jls-3.html#jls-3.8

В нем говорится:

Идентификатор представляет собой неограниченную последовательность букв Java и цифр Java, первая из которых должна быть буквой Java... Идентификатор не может иметь одно и то же правописание (последовательность символов Юникода) в качестве ключевого слова (§3.9), логический литерал ( §3.10.3), или нулевой литерал (§3.10.7), или ошибка времени компиляции.

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

Ответ 3

Как утверждают другие,

main - действительный Java-идентификатор, а также java1234.

Я предполагаю, что запутанность исходит из того факта, что main(String[]) метод main(String[]) часто используется в качестве точки входа JVM 1. Тем не менее, это не означает, что маркер main сам по себе не может быть использован в качестве идентификатора 2.

Спецификации говорят так, и следующие объявления также действительны:

  • Поле:

    private int main;
    
  • Локальная переменная:

    String main = "";
    
  • Метод:

    private void main() { ... }
    
  • Класс (хотя имя класса, начиная с нижнего регистра, не рекомендуется):

    public class main { ... }
    
  • Упаковка:

    package main;
    

1: Как отмечено в комментариях, спецификация JVM сама по себе не указывает какой-либо конкретный метод в качестве точки входа, но широко используемый инструмент java часто использует такой метод, как точка входа.
2: Я бы вообще избегал создания основного метода, кроме main(String[]).

Ответ 4

Это отлично компилируется на Java 1.8...

public class main {

    public String main = "main"; 

    public void main(String main) {
        System.out.println("This object is an instance of the class " + this.getClass().getCanonicalName());
        System.out.println("The value of the argument \"main\" for this call to the method \"main(String main)\" is " + main);
        System.out.println("The value of the field \"main\" is " + this.main);
    }

    public static void main(String[] args) {
        main main = new main();
        main.main(main.main + main.main);
    }
}

... и при выполнении выводит результат:

This object is an instance of the class main
The value of the argument "main" for this call to the method "main(String main)" is mainmain
The value of the field "main" is main

Ответ 5

Как main не может использоваться в качестве идентификатора, пока он используется как идентификатор для объявления "основного" метода?

Для такой классической идиомы:

public class Foo{
   public static void main(String[] args){
   }
}

main не является ключевым словом и, вероятно, никогда не будет ключевым словом в Java для очевидных причин ретро-совместимости.


О вопросе, является ли main хорошим идентификатором?

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

main имеет очень важное и важное значение: он используется как метод точки входа классов и банок, выполняемых командной строкой java.
Использование main для имени метода, которое не заполняет критерии, которые будут использоваться командной строкой java, будет просто вводить в заблуждение при использовании его в качестве имени переменной или может иметь смысл имя класса.
Например, определение класса, представляющего точку входа приложения в качестве Main класса приложения, приемлемо и поэтому использование его как имя переменной, например:

public class Main {

  public static void main(String args[]){
     Main main = new Main();
     // ...
  }      

}

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

Например, это может быть справедливо для компилятора:

public class Object { // 1
    public void foo() {
       ...
    }
}

public class BadChosenIdentifier {

    public static void main() { // 2
        new BadChosenIdentifier().toString(new Object());  
    }

    public void toString(Object java1234) { // 3, 4
        String _result$ = java1234 + " -> to avoid"; // 4
        System.out.println(_result$);
    }    
}

Но мы не хотим:

  • чтобы назвать Object нашим классом, поскольку это определено в java.lang (1).
  • чтобы назвать метод main() если не заполняет критерии, которые будут использоваться в командной строке java (2).
  • для перегрузки Object.toString() (3).
  • для обозначения наших переменных с помощью _, $ или любых удивительных/неизмеримых символов, которые противоречат общим соглашениям об именах (4).

Ответ 6

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

package main;

public class main {

    static main main;
    String Main;

    main(String main) {
        Main = main;
    }

    main(main main) {
        System.out.println(main.Main);
    }

    main main(main main) {
        return new main(main);
    }

    public static void main(main...Main) {
        main:
        for (main main : Main) {
            main = (main instanceof Main) ? new main(main): main.main(main);
            break main;
        }
    }

    public static void main(String[] args) {
        main = new main("main");
        main.main(main, main);
        main = main.new Main(main) {
            main main(main main) {
                return ((Main)main).main();
            }
        };
        main.main(main);
        main.main(main,main);
    }

    abstract class Main extends main {
        Main(main main) {
            super("main");
        }

        main main() {
            main.Main = "Main";
            return main;
        }
    }
}

Ответ 7

Является ли он действительным идентификатором? Да.

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

Является ли еще один действительный идентификатор? Да.

Как указано в инструкциях по тестированию, чтобы выбрать лучший ответ?

Ответ 9

public class Main {
    private static String main;
    public static void main(String[] main) {
        Main.main = main[0];
        new Main().main(Main.main);
    }
    private void main(String main) {
        System.out.println(main);
    }
}

Ответ 10

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

Ответ 11

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

Ответ 12

  1. Должно быть одно слово. То есть пробелы не допускаются.

    Пример: mangoprice действителен, но стоимость манго недействительна.

  2. Следует начинать с буквы (алфавита) или символа подчеркивания или символа $.

    Пример: цена, цена и цена - действительные идентификаторы.

  3. Не должно быть ключевого слова Java, поскольку ключевое слово несет в себе особое значение для компилятора.

    Пример: класс или пустота и т.д.

  4. Не следует начинать с цифры, но цифра может быть посередине или в конце.

    Пример: 5mangoescost недействителен и mango5cost и mangocost5 действительны.

  5. Длина идентификатора в Java может составлять 65 535 символов, и все они значительны. Идентификаторы чувствительны к регистру. Это как манго, так и манго, рассматриваются по-разному. Может содержать все прописные или строчные буквы или смесь.

IDENTIFIER: это имена классов, имена методов, имена переменных...

Поскольку основное не является зарезервированным словом, и в соответствии с приведенным выше объяснением для определения идентификатора main также является допустимым идентификатором и java1234. Возможные варианты недействительны из-за приведенного выше объяснения.

Ответ 13

    option b and c boths are valid, because main is not a keyword or reserve word it also valid.
   option a,d and e is invalid because you cant declare the identifiers with which have start with number or special character(except _ and $).
you can declare - abc_123,_abc,$abc
but can't declare like 123_abc,123_