我正在阅读一本电子书:
int :b;
int e#;
不是合法的标识符,但我不明白为什么“:”和“#”不是合法的标记。你有什么主意吗?
因为Java 语言规范是这么说的:
标识符是 Java 字母和 Java 数字的无限长度序列,其中第一个必须是 Java 字母。
Identifier:
IdentifierChars but not a Keyword or BooleanLiteral or NullLiteral
IdentifierChars:
JavaLetter
IdentifierChars JavaLetterOrDigit
JavaLetter:
any Unicode character that is a Java letter (see below)
JavaLetterOrDigit:
any Unicode character that is a Java letter-or-digit (see below)
“Java 字母”是 Character.isJavaIdentifierStart(int) 方法返回 true 的字符。
“Java 字母或数字”是 Character.isJavaIdentifierPart(int) 方法返回 true 的字符。
“Java 字母”包括大写和小写 ASCII 拉丁字母 AZ (\u0041-\u005a) 和 az (\u0061-\u007a),以及由于历史原因,ASCII 下划线(_ 或 \u005f)和美元符号($,或 \u0024)。$ 字符应仅用于机械生成的源代码中,或者很少用于访问遗留系统上预先存在的名称。
“Java 数字”包括 ASCII 数字 0-9 (\u0030-\u0039)。
字母和数字可能来自整个 Unicode 字符集,它支持当今世界上使用的大多数书写脚本,包括中文、日文和韩文的大型集。这允许程序员在他们的程序中使用以他们的母语编写的标识符。
有效标识符在JLS #3.8中定义。尤其:
“Java 字母”是 Character.isJavaIdentifierStart(int) 方法返回 true 的字符。
“Java 字母或数字”是 Character.isJavaIdentifierPart(int) 方法返回 true 的字符。
这两行输出 false,这使您的两个标识符无效:
System.out.println(Character.isJavaIdentifierPart(':'));
System.out.println(Character.isJavaIdentifierPart('#'));
请注意,有效的标识符包括 AZ、az、_、$ 以及许多“外来”字符。例如,这是一个有效的标识符:
int a_£à胥;
从JLS:
An identifier is an unlimited-length sequence of Java letters and Java digits,
the first of which must be a Java letter.
..
The "Java letters" include uppercase and lowercase ASCII Latin letters A-Z (\u0041-\u005a),
and a-z (\u0061-\u007a), and, for historical reasons, the ASCII underscore (_, or \u005f)
and dollar sign ($, or \u0024). The $ character should be used only in mechanically generated
source code or, rarely, to access pre-existing names on legacy systems.