我的一个孩子在高中学习Java,他的一次考试是这样的:

下列哪个在Java中是有效的标识符? 123 java。 b主要 c . java1234 d。{abce whoot e。)

他答了b,答错了。

我看了看这个问题,认为main是一个有效的标识符,它应该是正确的。

我们查看了标识符的Java规范,它加强了这一点。我们还编写了一个示例程序,其中包含一个名为main的变量和一个方法。他写了一份书面反驳,包括Java文档参考,测试程序和老师忽略了它,说答案仍然是错误的。

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;
        }
    }
}

其他回答

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,但不是关键字或BooleanLiteral或NullLiteral IdentifierChars: JavaLetter {JavaLetterOrDigit} JavaLetter: 任何“Java字母”的Unicode字符 JavaLetterOrDigit: 任何“Java字母或数字”的Unicode字符

字符序列main符合上述描述,并且不在第3.9节的关键字列表中。

(出于同样的原因,字符序列java1234也是一个标识符。)

正如其他答案所说

main是一个有效的Java标识符,java1234也是。

我想,这种混淆是由于main(String[])方法经常被JVM1用作入口点。但是,这并不意味着令牌main本身不能用作identifier2。

规范是这么说的,下面的声明也是有效的:

一个字段: 私人int主; 一个局部变量: 字符串main = ""; 一个方法: 无效主(){…} 类或接口(尽管不鼓励类或接口名称以小写开头): 类main{…} 一个包: 包主要;


1:正如评论中提到的,JVM规范本身并没有强制要求任何特定的方法作为入口点,但是广泛使用的java工具经常使用这样的方法作为入口点。 2:我通常会避免创建main方法而不是main(String[])。


附录:我不觉得这是咆哮的地方,但这里是我正确的拙见:标识符main和java1234一样有效,所以两者必须同等对待有效或错误。否则是不能容忍的。

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);
    }
}

main和java123都是有效的标识符,main不是保留关键字,所以使用它是完全可以接受的,就测试而言,你至少应该得到一分或半分。

那位老师犯了一个小错误,要么认为main不是一个有效的标识符,要么只是问题的措辞错误。他可能是想说“一个很好的标识符”。 但是,忽视你儿子的论点,从而阻止他以科学的方法检查相关文献(Java规范)并进行实验(编写示例程序),这与教师应该做的事情完全相反。