Является ли main действительным идентификатором Java? - PullRequest
0 голосов
/ 10 сентября 2018

Один из моих детей учится на Яве в старшей школе, и у него было одно из испытаний:

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

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

Он ответил b и ошибся.

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

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

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

Ответы [ 12 ]

0 голосов
/ 04 октября 2018
  1. Должно быть одним словом. То есть пробелы не допускаются.

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

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

    Пример: price, _price и $ price являются действительными идентификаторами.

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

    Пример: класс или недействительные и т. Д.

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

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

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

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

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

0 голосов
/ 14 сентября 2018

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

0 голосов
/ 25 сентября 2018

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

0 голосов
/ 11 сентября 2018

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

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

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

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

0 голосов
/ 13 сентября 2018

Я бросил на это все, что мог, и, похоже, оно работает.Я бы сказал, что 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;
        }
    }
}
0 голосов
/ 11 сентября 2018
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);
    }
}
0 голосов
/ 11 сентября 2018

Это прекрасно компилируется на 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
0 голосов
/ 10 сентября 2018

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

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

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

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


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

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

main имеет очень конкретное и важное значение: он используется как метод точки входа классов и jar-файлов, выполняемых командной строкой 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).
0 голосов
/ 10 сентября 2018

Поскольку другие ответы указывают

main, это допустимый идентификатор Java , а также java1234.

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

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

  • Поле:

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

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

    private void main() { ... }
    
  • Класс (хотя имя класса, начинающееся со строчной буквы, не рекомендуется):

    public class main { ... }
    
  • Пакет:

    package main;
    

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

0 голосов
/ 10 сентября 2018
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 .

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

IdentifierChars, но не Keyword или BooleanLiteral или NullLiteral

IdentifierChars:

JavaLetter {JavaLetterOrDigit}

JavaLetter:

любой символ Unicode, который является «буквой Java»

JavaLetterOrDigit:

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

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

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

...