2012-10-12 45 views
9

为什么在Java变量名称中不允许特殊字符($,_除外)?java中变量的命名限制

+2

这不是*公约*。 – 2012-10-12 10:47:13

+2

@pap谢谢,这个标题* *更好。 – 2012-10-12 10:49:29

+0

@pap谢谢,编辑 – NPKR

回答

16

情况并非如此 - 许多特殊字符实际上对标识符有效。它被定义为in the JLS #3.8

标识符是一个无限长的Java字母和Java数字序列,其中第一个必须是Java字母。
[...]
“Java字母”是方法Character.isJavaIdentifierStart(int)返回true的字符。
“Java字母或数字”是方法Character.isJavaIdentifierPart(int)返回true的字符。

例如,这是一个有效的变量名:

String sçèêûá¢é£¥ = "bc"; 

你可以看到所有与这个简单的代码的有效字符:

public static void main(String args[]) { 
    for (int i = 0; i < Character.MAX_VALUE; i++) { 
     if (Character.isJavaIdentifierPart(i)) { 
      System.out.println("i = " + i + ": " + (char) i); 
     } 
    } 
} 

PS:很好的例子on @PeterLawrey's blog

+1

+1为链接;) –

+1

我认为你的例子会更清晰,如果变量名称以“特殊”字符开头,如:Stringçèêûáé飬=“bc “; – cquezel

12

实际上有一个被允许在Java中的标识符,因为它是一个巨大的数字特殊字符。例如,你可以有充分的货币符号,和所有10个连续符(不只是_)

if(⁀ ‿ ⁀ == ⁀ ⁔ ⁀ || ¢ + ¢== ₡) 

更奇怪的是,你可以有哪些是不可见的字符或安排向后打印的文本。

以下程序在其标识符中有\u202e导致其“特殊”外观。

for (char c‮h = 0; c‮h < Character.MAX_VALUE; c‮h++) 
    if (Character.isJavaIdentifierPart(c‮h) && !Character.isJavaIdentifierStart(c‮h)) 
     System.out.printf("%04x <%s>%n", (int) c‮h, "" + c‮h); 

这打印编译和运行的标识符中允许的所有特殊字符。

http://vanillajava.blogspot.co.uk/2012/09/hidden-code.html

http://vanillajava.blogspot.co.uk/2012/08/uses-for-special-characters-in-java-code.html

+5

+1爱的第一个变量名:) –

+1

⁀‿⁀......... –

+0

我也试过这样做,但只能得到: -^_^.. :)需要改进。 –