main 是有效的 Java 标识符吗?

我的一个孩子在高中时正在学习Java,并在他的一次测试中进行了以下测试:

以下哪项是 Java 中的有效标识符?

a.
b.
c.
d.
e.123javamainjava1234{abce)whoot

他回答了b,弄错了。

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

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

是有效的标识符吗?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 字母

标识符:

标识符字符,但不是关键字或布尔文体或空文

标识符字符:

JavaLetter {JavaLetterOrDigit}

JavaLetter:

任何作为“Java 字母”的 Unicode 字符

JavaLetterOrDigit:

任何属于“Java 字母或数字”的 Unicode 字符

字符序列符合上述说明,不在 Section 3.9 的关键字列表中main

(出于同样的原因,字符序列也是一个标识符。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) 相同的拼写(Unicode 字符序列),否则会发生编译时错误。

这意味着您可以通过以下方式证明它是有效的标识符:

  • 在java关键字列表中查找它(提示:你不会在那里找到它!)或简单地通过
  • 将其用作标识符,并观察到不会发生编译时错误。

推荐