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不是 ,不行了搞不动了。。这就研究到这了