在學習有關java枚舉的時候,我們知道了所有的枚舉類型均是繼承自java.lang.Enum類的,且所有的枚舉常量均是該枚舉類型的一個對象,且對象名即為該枚舉常量的名稱。例子如下:源碼: 反編譯後的代碼: 在寫代碼的時候,由於輸入法切換的問題,發現枚舉常量的常量名稱居然是可以使用中文的。代碼如下: ...
在學習有關java枚舉的時候,我們知道了所有的枚舉類型均是繼承自java.lang.Enum類的,且所有的枚舉常量均是該枚舉類型的一個對象,且對象名即為該枚舉常量的名稱。
例子如下:
源碼:
public enum T { SPRING,SUMMER,AUTUMN,WINTER; }
反編譯後的代碼:
public final class T extends Enum { private T(String s, int i) { super(s, i); } public static T[] values() { return (T[])$VALUES.clone(); } public static T valueOf(String s) { return (T)Enum.valueOf(T, s); } public static final T SPRING; public static final T SUMMER; public static final T AUTUMN; public static final T WINTER; private static final T $VALUES[]; static { SPRING = new T("SPRING", 0); SUMMER = new T("SUMMER", 1); AUTUMN = new T("AUTUMN", 2); WINTER = new T("WINTER", 3); $VALUES = (new T[] { SPRING, SUMMER, AUTUMN, WINTER }); } }
在寫代碼的時候,由於輸入法切換的問題,發現枚舉常量的常量名稱居然是可以使用中文的。
代碼如下:
public enum Spring { 春天; } class Test { public static void main(String[] args) { System.out.println(Spring.春天); } }
其編譯器並沒有報錯,且順利的通過了編譯。
對以上枚舉類的代碼進行反編譯,得到如下的結果。
發現,其對象名為中文。而在java的命名規範中,只允許用美元符號$,英文字母,數字,下劃線作為命名的元素。那麼如今反編譯的結果中出現了中文的情況,這是什麼回事呢?
經過分析和查找相關資料,發現,java其實是支持中文類名、方法名、屬性名,並且不會因為亂碼問題導致運行期鏈接失敗。這是Java內核支持UTF-8這一特性決定的。但是Java語言規範里並不支持這一用法。所以,如下的代碼運行起來是完全沒有問題的。
package other.jdk1_5; /** * 一個騷操作,使用中文對變數和方法進行命名 * * @author 學徒 * */ public class 人 { private String 名字; private int 年齡; public String get名字() { return 名字; } public void set名字(String 名字) { this.名字 = 名字; } public int get年齡() { return 年齡; } public void set年齡(int 年齡) { this.年齡 = 年齡; } public static void main(String[] args) { 人 小明 = new 人(); 小明.set名字("小明"); System.out.println(小明.get名字()); } } 運行結果:
小明