2012-10-12 82 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

我也試過這樣做,但只能得到: -^_^.. :)需要改進。 –