SO上的许多地方导致Identifiers上的JLS部分,但我对那里的内容有疑问。
“Java字母”包括大写和小写ASCII拉丁字母 A-Z(\ u0041- \ u005a)和a-z(\ u0061- \ u007a),以及历史 原因,ASCII下划线(_,或\ u005f)和美元符号($,或 \ u0024)。 $字符只能用于机械生成 源代码,或者很少访问遗留的预先存在的名称 系统。 “Java数字”包括ASCII数字0-9 (\ u0030- \ u0039)。
但它继续说:
可以从整个Unicode字符集中绘制字母和数字, 它支持当今世界上使用的大多数编写脚本, 包括中文,日文和韩文的大套。这个 允许程序员在他们的程序中使用标识符 用他们的母语写成。
我不明白这两者是如何都是真的。第一部分似乎确切地说明了哪些字符是允许的,而第二部分似乎表示津贴更灵活。
我同意使用“包括”代替“包括但不限于”表示它并不完全矛盾。但它也首先专门指“Java字母”/“Java数字”,然后将其放宽为“字母”/“数字”。我的主要观点是缺乏清晰度,我希望确认我的意思。
答案 0 :(得分:1)
根据问题Legal identifiers in Java,您可以看到有许多合法标识符。
[对于使用罗马字母的语言]在使用约定命名标识符时,仅使用字母数字字符和偶尔使用下划线。但是,可以使用大量字符。
第一段是指java程序员使用合理一致且可读的命名方案的代码风格或约定。你引用的第二段解释说,JVM会接受大量其他角色 - 尽管你的同事们可能不赞成。
答案 1 :(得分:1)
第一部分是第二部分的特例,两部分中提到的字符必须满足JLS 3.8中提到的标准,这里错过了
“Java letter”是Character.isJavaIdentifierStart(int)方法返回true的字符。 “Java letter-or-digit”是该方法的字符 Character.isJavaIdentifierPart(int)返回true。
上述方法接受/验证与包含Basic-Latin字符集(第1节)的整个Unicode字符集(第2节)中的字符对应的代码点。
通常,你永远不会看到任何人超越他们的Java源文件中的Basic-Latin字符集。