次のような電子書籍を読んでいます。
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 を返す文字です。
これらの 2 行は false を出力するため、2 つの識別子が無効になります。
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.