我正在阅读SCJP,我对这一行有疑问:
标识符必须以字母,货币字符($)或a开头 连接字符,如下划线(_)。标识符不能 从一个数字开始!
它声明有效的标识符名称可以以连接字符开头,例如下划线。我认为下划线是唯一有效的选择吗?还有哪些连接字符?
答案 0 :(得分:265)
以下是连接字符列表。这些是用于连接单词的字符。
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 + " ");
}
打印
$ _¢¥¥৲৻૱฿฿‿⁀₠₡₢₣₤₦₨₩₩₩₩₩₰₰₰₰﷼﷼₵₸₸₸﷼﷼﷼﷼ ﹍﹍﹎$ $ _¢£¥₩
答案 1 :(得分:25)
遍历整个65k字符并询问Character.isJavaIdentifierStart(c)
。
答案是:&#34;承诺&#34;十进制8255
答案 2 :(得分:7)
合法Java标识符的明确规范可以在Java Language Specification。
中找到答案 3 :(得分:6)
Here is a List连接器Unicode中的字符。你不会在键盘上找到它们。
U + 005F LOW LINE _
U + 203F UNDERTIE‿
U + 2040 CHARACTER TIE⁀
U + 2054倒置UND
U + FE33垂直低线的演示形式_
U + FE34垂直波浪低线的演示形式︴
U + FE4D DASHED LOW LINE﹍
U + FE4E CENTRELINE LOW LINE﹎
U + FE4F WAVY LOW LINE﹏
U + FF3F FULLWIDTH LOW LINE _
答案 4 :(得分:4)
连接字符用于连接两个字符。
在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&amp; jdk1.8.0_51用于以下两个连接字符(向后兼容性... oops !!!),
character: ・, codepoint: 12539, hexcode: 30fb
character: ・, codepoint: 65381, hexcode: ff65
无论如何,除了详细信息之外, 考试只关注基本拉丁字符集 。
此外,对于Java中的法律标识,提供了规范here。使用Character类API获取更多详细信息。
答案 5 :(得分:1)
Java标识符中允许的最有趣,最好玩的字符之一(但不是在开头)是名为“Zero Width Non Joiner”的unicode字符(&amp; zwnj;,U + 200C,{{3} })。
我曾经在一个XML中使用过一段XML,该属性值包含对另一段XML的引用。由于ZWNJ是“零宽度”,因此无法看到(除非与光标一起行走,否则它将显示在角色之前)。它也无法在日志文件和/或控制台输出中看到。但它始终存在:copy&amp;粘贴到搜索字段得到它,因此没有找到引用的位置。然而,在搜索字段中键入(可见部分)字符串可以找到引用的位置。我花了一段时间来弄明白这一点。
在使用欧洲键盘布局时,键入零宽度 - 非连接器实际上非常容易(太简单),至少在其德语版本中,例如“Europatastatur 2.02” - 可以通过AltGr +“。”来访问,不幸的是,在大多数键盘上,两个键直接相邻,很容易被意外碰到。
回到Java:我想,你可以写一些像这样的代码:
void foo() {
int i = 1;
int i = 2;
}
第二个i附加一个零宽度非连接符(在上面的代码中不能在stackoverflow的编辑器中剪切),但是这不起作用。 IntelliJ(16.3.3)没有抱怨,但JavaC(Java 8)确实抱怨已经定义的标识符 - 似乎JavaC实际上允许ZWNJ字符作为标识符的一部分,但是当使用反射来查看它的作用时,ZWNJ字符被剥离了标识符 - 像‿这样的字符不是。
答案 6 :(得分:0)
你可以在里面你的标识符(而不仅仅是在开头)使用的字符列表很多更有趣:
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!
它包含大多数控制角色!我的意思是钟声和狗屎!你可以让你的源代码响铃!或使用有时仅显示的字符,如软连字符。