私はSCJPを読んでいて、この行について質問があります:
識別子は、文字、通貨文字 ($)、またはアンダースコア ( _ ) などの接続文字で始まる必要があります。識別子は数字で始めることはできません!
有効な識別子名はアンダースコアなどの接続文字で始めることができると述べています。アンダースコアが唯一の有効なオプションだと思いましたか? 他につながるキャラクターは?
私はSCJPを読んでいて、この行について質問があります:
識別子は、文字、通貨文字 ($)、またはアンダースコア ( _ ) などの接続文字で始まる必要があります。識別子は数字で始めることはできません!
有効な識別子名はアンダースコアなどの接続文字で始めることができると述べています。アンダースコアが唯一の有効なオプションだと思いましたか? 他につながるキャラクターは?
接続キャラ一覧はこちら。これらは、単語を接続するために使用される文字です。
http://www.fileformat.info/info/unicode/category/Pc/list.htm
U+005F _ LOW LINE
U+203F ‿ UNDERTIE
U+2040 ⁀ CHARACTER TIE
U+2054 ⁔ INVERTED UNDERTIE
U+FE33 ︳ PRESENTATION FORM FOR VERTICAL LOW LINE
U+FE34 ︴ PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
U+FE4D ﹍ DASHED LOW LINE
U+FE4E ﹎ CENTRELINE LOW LINE
U+FE4F ﹏ WAVY LOW LINE
U+FF3F _ FULLWIDTH LOW LINE
これは Java 7 でコンパイルされます。
int _, ‿, ⁀, ⁔, ︳, ︴, ﹍, ﹎, ﹏, _;
例。この場合tp
、列の名前と特定の行の値です。
Column<Double> ︴tp︴ = table.getColumn("tp", double.class);
double tp = row.getDouble(︴tp︴);
以下
for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++)
if (Character.isJavaIdentifierStart(i) && !Character.isAlphabetic(i))
System.out.print((char) i + " ");
}
版画
$ _¢£¤¥¥؋؋؋৳৳૱૱௹៛‿⁀⁀⁔₠₡₣₣₣₤₥₥₧₨₨₫₫₫₫₭₮₯ ﹩ $ _ ¢ £ ¥ ₩</p>
65k 文字全体を反復処理し、尋ねるCharacter.isJavaIdentifierStart(c)
。答えは : "undertie" 10 進数 8255
正当な Java 識別子の最終的な仕様は、Java 言語仕様に記載されています。
Unicode のコネクタ文字のリストを次に示します。キーボード上にはありません。
U+005F LOW LINE _
U+203F UNDERTIE ‿<br> U+2040 CHARACTER TIE ⁀
U+2054 Inverted Undertie ⁔<br> U+FE33 バーティカル ロー ラインのプレゼンテーション フォーム ︳<br> U+FE34 バーティカル ウェーブのプレゼンテーション フォームLOW LINE ︴<br> U+FE4D DASHED LOW LINE ﹍<br> U+FE4E センターライン LOW LINE ﹎<br> U+FE4F WAVY LOW LINE ﹏<br> U+FF3F 全幅 LOW LINE _
接続文字は、2 つの文字を接続するために使用されます。
Java では、接続文字はCharacter.getType(int codePoint) / Character.getType(char ch)がCharacter.CONNECTOR_PUNCTUATIONと等しい値を返すものです。
Java では、文字情報は、 Connector_Punctuationのエイリアスである一般カテゴリ Pc を割り当てることによって接続文字を識別する Unicode 標準に基づいていることに注意してください。
次のコード スニペット、
for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++) {
if (Character.getType(i) == Character.CONNECTOR_PUNCTUATION
&& Character.isJavaIdentifierStart(i)) {
System.out.println("character: " + String.valueOf(Character.toChars(i))
+ ", codepoint: " + i + ", hexcode: " + Integer.toHexString(i));
}
}
jdk1.6.0_45 で識別子を開始するために使用できる接続文字を出力します
character: _, codepoint: 95, hexcode: 5f
character: ‿, codepoint: 8255, hexcode: 203f
character: ⁀, codepoint: 8256, hexcode: 2040
character: ⁔, codepoint: 8276, hexcode: 2054
character: ・, codepoint: 12539, hexcode: 30fb
character: ︳, codepoint: 65075, hexcode: fe33
character: ︴, codepoint: 65076, hexcode: fe34
character: ﹍, codepoint: 65101, hexcode: fe4d
character: ﹎, codepoint: 65102, hexcode: fe4e
character: ﹏, codepoint: 65103, hexcode: fe4f
character: _, codepoint: 65343, hexcode: ff3f
character: ・, codepoint: 65381, hexcode: ff65
以下は jdk1.6.0_45 でコンパイルされます。
int _, ‿, ⁀, ⁔, ・, ︳, ︴, ﹍, ﹎, ﹏, _, ・ = 0;
どうやら、上記の宣言は jdk1.7.0_80 および jdk1.8.0_51 で、次の 2 つの接続文字 (下位互換性...おっと!!!) のコンパイルに失敗するようです。
character: ・, codepoint: 12539, hexcode: 30fb
character: ・, codepoint: 65381, hexcode: ff65
とにかく、詳細はさておき、試験は Basic Latin character set のみに焦点を当てています。
また、Java の正当な識別子については、仕様が提供されています ここ. Character クラス API を使用して詳細を取得します。
識別子の中で (最初だけではなく)使用できる文字のリストは、もっと楽しいものです。
for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++)
if (Character.isJavaIdentifierPart(i) && !Character.isAlphabetic(i))
System.out.print((char) i + " ");
リストは次のとおりです。
I wanted to post the output, but it's forbidden by the SO spam filter. That's how fun it is!
ほとんどの制御文字が含まれています。私は鐘とたわごとを意味します!あなたのソース コードで fn ベルを鳴らすことができます! または、ソフト ハイフンなど、時々しか表示されない文字を使用します。