Java 标识符的定义规则:
1. 标识符的首字符所对应的代码点必须使得Character类的isJavaIdentifierStart方法返回值为true,后续字符所对应的代码点必须使得Character类的isJavaIdentifierPart返回值为true。(随着JDK版本的增加符合的字符数目也不断增加着)
2. 标识符不能与Java关键字相同。
3. 标识符不能与Java中预定义的字面常量名称相同(true, false, null)。
4. 标识符的长度必须在系统所支持的范围内(这点是Java虚拟机所要求的)。
public static void main(String args[]) {
int start = 0;
int part = 0;
for (int i = 0x0000; i <= 0x10ffff; i++) {
if (Character.isJavaIdentifierStart(i))
start++;
if (Character.isJavaIdentifierPart(i))
part++;
}
System.out.println("Unicode字符集个数:" + (0x10ffff+1));
System.out.println("可作为标识符首字符的字符个数:" + start);
System.out.println("可作为标识符一部分的字符个数:" + part);
System.out.println("二者之差:" + (part - start));
}
输出:
Unicode字符集个数:1114112
可作为标识符首字符的字符个数:101296
可作为标识符一部分的字符个数:103584
二者之差:2288
注意:
1. 由上规则可以看出不符合标识符首字符规则的不仅是0-9十个数字。
2. 尽量避免$作为标识符的使用,因为$通常在编译器生成的标识符名称中使用,可能会起到冲突。因为$在源文件(.java)编译成字节码(.class)后会成为顶层类型与嵌套类型之间的连接符。例如:如果存在一个顶层类A,在其内声明一个类B,那么编译之后就会产生两个class文件,分别为A.class和A$B.class。所以如果文件中还存在另外一个顶层类A$B,那么编译之后生成的A$B.class文件就会与A的成员类冲突。
3. Java语言规范中,标识符的长度是任意的。但是在java 虚拟机规范中,标识符是有长度限制的。在class文件中,代表标识符的常量字符串在CONSTANT_Utf8_info表中,而该表使用两个字节(length)来表示字符串的长度,length是无符号类型,所以最大长度是2 ^16 – 1,即65535。但是这个最大长度仅限于除了空字符以外的ASCII字符,如果超出这个范围,最大长度将会减少。