[java] main이 유효한 Java 식별자입니까?

내 아이들 중 하나가 고등학교에서 Java를 사용하고 있으며 그의 테스트 중 하나에서 이것을 가지고 있습니다.

다음 중 Java에서 유효한 식별자는 무엇입니까?

ㅏ. 123java
비. main
씨. java1234
디. {abce
이자형. )whoot

그는 b 에 대답 하고 잘못했습니다.

나는 질문을 보았고, 그 주장 main 이다 유효한 식별자과 잘 했어야있다.

식별자 에 대한 Java 사양 을 살펴본 후 그 점을 강화했습니다. 우리는 또한 main메소드 라는 변수를 가진 샘플 프로그램을 작성했습니다 . 그는 Java 문서 참조, 테스트 프로그램 및 교사가이를 무시하고 답변이 여전히 옳지 않다는 서면 반박을 작성했습니다.

main유효한 식별자는?



답변

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입니다 .

식별자 의 무제한 길이의 순서입니다 자바 문자자바 자리 해야 처음있는, 자바 문자 .

식별자 :

    IdentifierChars이지만 키워드, BooleanLiteral 또는 NullLiteral은 제외

식별자

    JavaLetter {JavaLetterOrDigit}

JavaLetter :

    “자바 문자”인 유니 코드 문자

JavaLetterOrDigit :

    “자바 문자”인 유니 코드 문자

문자 순서 main는 위의 설명에 적합하며 3.9 절의 키워드 목록에 없습니다 .

(문자 시퀀스 java1234도 같은 이유로 식별자입니다.)


답변

main 유효한 Java 식별자이며 교사가 잘못되었습니다.

관련 문서는 Java 언어 사양에 있습니다.

3 장. “Lexical Structure”, 섹션 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) 또는 null 리터럴 (§3.10.7) 또는 컴파일 타임 오류가 발생합니다.

이는 다음 중 하나에 의해 유효한 식별자임을 증명할 수 있음을 의미합니다.

  • 자바 키워드 (힌트 : 당신은 그것을 찾을 수 없습니다!) 또는 단순히
  • 이를 식별자로 사용하고 컴파일 타임 오류가 발생하지 않는 것을 관찰합니다.

답변

다른 답변 상태로

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(String[])입니다.


답변

이것은 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


답변

나는 그것에 할 수있는 모든 것을 던졌고 작동하는 것 같습니다. 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;
        }
    }
}


답변

main“메인”메소드를 선언하는 식별자로 사용되는 동안 식별자로 어떻게 사용할 수 없습니까?

그런 고전 관용구 :

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

main 는 키워드가 아니며 명백한 레트로 호환성을 이유로 Java에서는 키워드가 아닐 수 있습니다.


질문에 main대해 좋은 식별자입니까?

첫째 : 컴파일러에 유효하다고해서 반드시 좋은 것은 아닙니다.
예를 들어 java1234제안 된 옵션도 유효한 식별자이지만 실제로 피해야합니다.

main매우 특별하고 중요한 의미를 지니고 있습니다. java명령 행에서 실행되는 클래스 및 jar의 시작점 메소드로 사용됩니다 .
사용 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$);
    }
}

그러나 우리는 원하지 않습니다 :

  • 이름을 Objectjava.lang(1)에 정의 된대로 클래스 합니다 .
  • 방법의 이름을 지정 main()java명령 행에서 사용할 기준을 채우지 않은 경우 (2).
  • Object.toString()방법 (3) 을 과부하 .
  • 우리와 변수 이름을 지정합니다 _, $또는 공유 이름 지정 규칙 (4)에 가서 어떤 놀라운 일 / unmeaningful 문자.

답변

유효한 식별자입니까? 예.

좋은 식별자입니까? JVM을 시작할 때 시작하는 방법 이외의 용도로 사용하지 않는 경우.

유효한 다른 식별자가 있습니까? 예.

테스트 지침에 최상의 답변을 선택하라고 했습니까?