?1. 当你创建一个enum类时,编译器会为你生成一个相关的类,这个类继承自Enum
/** * 枚举类默认继承的java.lang.Enum类(编译器控制),所以不能再继承其它类 * Enum实现了 Comparable<E>, Serializable 接口 */ public enum MeiJu { MEIJU1, MEIJU2, MEIJU3, MEIJU4 }?
?
public class Test { public static void main(String[] args) { // 注意这里已经向上转型了哦 for (Enum<MeiJu> meiju : MeiJu.values()) { // ------------------下面都是父类(Enum)提供的方法-------------------- // 返回枚举常量的序数ordinal,final修饰,不可变,按声明时的顺序 System.err.println("ordinal():" + meiju.ordinal()); // 输出:0 、1 、 2、3 // 返回枚举常量的名称name,final修饰,不可变 // 跟meiju.toString()返回内容是一样的:都是 return this.name; // 不过如果使用toString(),可以对其重写 System.err.println("name():" + meiju.name()); // 输出: MEIJU1 、MEIJU2 、MEIJU3、MEIJU4 // 只能比较同一枚举类下的枚举常量,so 比较的是声明顺序ordinal System.err.println("compareTo():" + meiju.compareTo(MeiJu.MEIJU2)); // 输出 -1 、0 、1、2 // 返回 return this == MeiJu.MEIJU2; System.err.println("equals():" + meiju.equals(MeiJu.MEIJU2)); // 输出:false true false false // 跟这个结果一样meiju.getClass(),没有找到不一样的情况 ?? System.err.println("getDeclaringClass():" + meiju.getDeclaringClass()); // 输出:都是 class package.MeiJu // 还有一个 hashCode() 它返回的是 super.hashCode(); // Enum 的 super 就是 Object 了 // 搞不明白这玩意干什么用 MeiJu valueOf = Enum.valueOf(meiju.getDeclaringClass(),meiju.name()); // 其它就没什么了吧。。。。上面蓝色字体略掉了 } } }
?????? 细心人士,会发现上面的代码中,我并没有给枚举类MeiJu添加方法,而且Enum中也没有values()方法。原因看下面两个图片比较一下
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
??2. 给枚举定义方法,记得在枚举常量后面加";"
public enum MeiJu { //定义每个枚举实例,如果有构造方法,必须通过构造方法初始化定义; MEIJU1("husband"), MEIJU2("wife"), MEIJU3("son"), MEIJU4("xiaosan"); private String property; //属性 private MeiJu(String property) { //只能在内部使用 this.property = property; } @Override public String toString() { return name() + ":" + property; } public static void main(String[] args) { for (MeiJu meiju : MeiJu.values()) { System.err.println( meiju.toString()); } } }
?输出:
?
?????? ?MEIJU1:husband
????????MEIJU2:wife
??????? MEIJU3:son
?????? ?MEIJU4:xiaosan
?
3. 枚举使用 switch
public class Test { public String test(MeiJu meiju) { switch (meiju) { case MEIJU1 : return meiju.toString(); case MEIJU2 : return meiju.toString(); case MEIJU3 : return meiju.toString(); case MEIJU4 : return meiju.toString(); default :return ""; } } public static void main(String[] args) { Test t = new Test(); System.err.println(t.test(MeiJu.MEIJU4)); } }
?输出:MEIJU4:xiaosan
?
?
4. Class还给枚举类弄了个专属武器getEnumConstants(),所以即使在enum被向上转型也能得到其所有实例。
public class Test { public void test(Enum<?> meiju) { // 注意:Enum是没有 meiju.values() 方法的。 // 不过Class中有方法getEnumConstants()可以得到枚举所有实例 for (Enum<?> en : meiju.getClass().getEnumConstants()) { System.err.println(en.toString());// 覆盖后的toString } } public static void main(String[] args) { Test t = new Test(); t.test(MeiJu.MEIJU4); } }
public class Test { // 上面方法的扩展 public <E extends Enum<E>> void test(Class<E> meiju) { // 泛型 参考上一篇 java泛型 for (E en : meiju.getEnumConstants()) { System.err.println(en.toString()); } } public static void main(String[] args) { Test t = new Test(); t.test(MeiJu.MEIJU4.getDeclaringClass()); // t.test(MeiJu.MEIJU4.getClass()); //这样就不行了 t.test((Class) MeiJu.MEIJU4.getClass());// 这样可以,但是一堆警告 } }
??
??输出:
?????? MEIJU1:husband
?????? MEIJU2:wife
?????? MEIJU3:son
?????? MEIJU4:xiaosan
?
?
5. 通过枚举管理枚举?
public enum MeiJu { ;//注意这里有个";" enum MeiJu1 {A, B, C} enum MeiJu2 {D, E, F} public static void main(String[] args) { for (MeiJu1 meiju1 : MeiJu.MeiJu1.values()) { System.err.print(meiju1); //输出:ABC } } }
?
?
6.EnumSet现在是个抽象类(JavaSE 7),EnumMap不是 ,不行了搞不动了。。这就研究到这了
原文:http://flyouwith.iteye.com/blog/2174422