我读了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 + " ");
}
版画
$ _¢£¤¥؋৲৳৻૱௹฿៛‿⁀⁔₠₡₢₣₤₥₦₧₨₩₪₫€₭₮₯₰₱₲₳₴₵₶₷₸₹꠸﷼_︴﹍﹎﹏ $ $ _¢£¥₩
在整个65K字符进行迭代,并问Character.isJavaIdentifierStart(c)
答案是:“undertie”十进制8255
一个合法的Java标识符的权威性规范可以在找到Java语言规范 。
这里是一个列表中的Unicode字符连接的。 你不会找到他们在键盘上。
U + 005F低线_
U + 203F UNDERTIE‿
U + 2040字符TIE⁀
U + 2054 INVERTED UNDERTIE⁔
U + FE33 PRESENTATION形成垂直低线_
U + FE34 PRESENTATION形成垂直WAVY低线︴
U + FE4D DASHED低线﹍
U + FE4E中心线低线﹎
U + FE4F WAVY低线﹏
U + FF3F FULLWIDTH低线_
的连接字符被用来连接两个字符。
在Java中,一个连接字符是一个针对Character.getType(INT码点) / Character.getType(炭CH)返回等于值Character.CONNECTOR_PUNCTUATION 。
需要注意的是在Java中,字符信息基于其标识由他们分配给普通类PC,这是一个别名连接字符的Unicode标准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一个IDENTIFER连接字符
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
无论如何,抛开细节, 考试只关注基本拉丁字符集 。
此外,在Java法律identifers,该规范提供了这里 。 使用字符类的API,以获得更多的细节。
其中最,好,乐趣在Java标识允许(但不是在开始)字符的是名为“零宽不连字”的Unicode字符(zwnj ;, U + 200C, https://en.wikipedia.org /维基/零width_non-木匠 )。
我在属性值保持到另一块的是XML的基准内部一块XML的过一次。 由于ZWNJ是“零宽度”,它不能被看到(用光标沿行走时除外,它显示有良好的字符之前)。 它也不能在日志文件和/或控制台输出可以看出。 但它在那里所有的时间:复制粘贴到搜索领域得到它,因此没有发现被称为位置。 键入串在搜索字段中(的可见部分),然而发现了称为位置。 我花了一段时间才能弄清楚这一点。
键入一个零宽度非木其实是很容易的(太容易)使用欧洲键盘布局时,至少在德国的变种,例如“Europatastatur 2.02” - 这是到达与键AltGr +,两个键它“”不幸的是直接位于彼此相邻大多数键盘上,可以很容易被不小心撞到了一起。
返回到Java:我想好了,你可以写一些像这样的代码:
void foo() {
int i = 1;
int i = 2;
}
与由零宽度的非木匠所附第二i(不能做到这一点,在计算器的编辑剪断上面的代码),但是没有工作。 的IntelliJ(16.3.3)没有抱怨,但javac的(Java 8)没有抱怨一个已经定义的标识符 - 它似乎javac的实际允许ZWNJ字符作为标识符的一部分,但使用反射时,看看它做什么,在ZWNJ字符被剥离的标识 - 这就像‿字符都没有。
您可以将您的标识符(而不是仅仅在开始) 中使用的字符的列表是更有趣:
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钟! 或用途,其将仅有时会显示,像柔软的连字符。