我正在备考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 + " ");
}
打印
$ _ ¢ £ ¤ ¥ ؋ ৲ ৳ ৻ ૱ ௹ ฿ ៛ ‿ ⁀ ⁔ ₠ ₡ ₢ ₣ ₤ ₥ ₦ ₧ ₨ ₩ ₪ ₫ € ₭ ₮ ₯ ₰ ₱ ₲ ₳ ₴ ₵ ₶ ₷ ₸ ₹ ꠸ ﷼ ︳ ︴ ﹍ ﹎ ﹏ ﹩ $ _ ¢ £ ¥ ₩
int ৲, ¤, ₪₪₪₪;
:D - Peter Lawreyif( ⁀ ‿ ⁀ == ⁀ ⁔ ⁀)
or if ($ == $)
or if (¢ + ¢== ₡)
or if (B + ︳!= ฿)
?@GrahamBorland,以下是您提供的代码片段:if( ⁀ ‿ ⁀ == ⁀ ⁔ ⁀)
if ($ == $)
if (¢ + ¢== ₡)
if (B + ︳!= ฿)
isJavaIdentifierPart
而不是isJavaIdentifierStart
,会更有趣! - Aleksandr Dubinsky(1 to 65535).map(_.toChar).filter(Character.isJavaIdentifierStart).size
- 运行结果为48529个字符... - Tomasz NurkiewiczCharacter.MAX_CODE_POINT
,这可能超过了2<<16
。 - Martijn CourteauxJava合法标识符的明确规范可以在Java语言规范中找到。
L
[所有]、Nl
、Sc
、Pc
。 - Random832这里是Unicode中连接符号的列表。你无法在键盘上找到它们。
U+005F 下划线 _
U+203F 下波浪线 ‿
U+2040 字符连结线 ⁀
U+2054 反转下波浪线 ⁔
U+FE33 竖排低线 ︳
U+FE34 竖排波浪低线 ︴
U+FE4D 虚线下划线 ﹍
U+FE4E 中央虚线下划线 ﹎
U+FE4F 波浪虚线下划线 ﹏
U+FF3F 全角下划线 _
一个连接字符用于连接两个字符。
在Java中,连接字符是指Character.getType(int codePoint)/Character.getType(char ch)返回值等于Character.CONNECTOR_PUNCTUATION的字符。
请注意,在Java中,字符信息基于Unicode标准,该标准通过将连接字符分配给一般类别Pc(Connector_Punctuation的别名)来识别它们。
以下代码片段:
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上由于以下两个连接字符而无法编译(向后兼容...哎呀!!!)
character: ・, codepoint: 12539, hexcode: 30fb
character: ・, codepoint: 65381, hexcode: ff65
void foo() {
int i = 1;
int i = 2;
}
你可以在标识符中使用的字符列表(而不仅仅是在开头)更加有趣:内部。
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铃声!或者使用仅在某些情况下显示的字符,例如软连字号。
_
重新用于未来的语言特性中。以下划线开头的标识符仍然可以使用,但如果用作 lambda 参数名称,则单个下划线是一个错误,其他任何地方使用都会发出警告。 - Boann. ; [ / < > :
的序列都可以通过:https://dev59.com/F4Tca4cB1Zd3GeqPBfbb https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.3.4 其他所有内容都是Java特有的限制。 - Ciro Santilli OurBigBook.com_, _ -> doSomething();
。 - user31389