转载自:http://blog.youkuaiyun.com/tanggao1314/article/details/53150298
那么,应该这么理解枚举类型的原理,首先enum Color继承了Java.lang.Enum这个抽象类,但enum Color还是一个抽象类,所以它可以有抽象方法和非抽象方法。
而enum Color中的枚举值变量RED事实上上Color的一个匿名子类,所以它可以实现Color中的抽象方法,这样,当调用System.out.println(Color.RED.getName());就是调用了匿名子类实现的方法。
最后再附上两个使用Java普通类模拟枚举的例子:
public enum Color
{
RED{
public String getName(){
return "红色";
}
}
,GREEN{
public String getName(){
return "绿色";
}
}
,YELLOW{
public String getName(){
return "黄色";
}
};
public abstract String getName();
}
如果RED只是一个Color类的一个static final的实例,那么上面的代码就很让了费解了,为什么在枚举类型中可以有一个抽象方法,而每个枚举值可以对其重新实现?来看下一段测试代码:public class EnumDemoFour{
public static void main(String[] args){
//打印该枚举值的名称
System.out.println(Color.RED.getName());
//打印该枚举值的类
System.out.println(Color.RED.getClass());
//打印该枚举值的类的父类
System.out.println(Color.RED.getClass().getSuperclass());
//打印该枚举值的类的父类的父类
System.out.println(Color.RED.getClass().getSuperclass().getSuperclass());
//打印该枚举类型的修饰符
System.out.println(Modifier.toString(Color.class.getModifiers()));
}
/*运行结果
红色
class com.lxq.enumm.Color$1
class com.lxq.enumm.Color
class java.lang.Enum
public abstract*/
}
该运行结果首先说明了RED和Color不是同一个类,而是前者是后者的一个子类;同时也说明了enum申明的其实是一个abstract的类,所以Color中可以有抽象方法。那么,应该这么理解枚举类型的原理,首先enum Color继承了Java.lang.Enum这个抽象类,但enum Color还是一个抽象类,所以它可以有抽象方法和非抽象方法。
而enum Color中的枚举值变量RED事实上上Color的一个匿名子类,所以它可以实现Color中的抽象方法,这样,当调用System.out.println(Color.RED.getName());就是调用了匿名子类实现的方法。
最后再附上两个使用Java普通类模拟枚举的例子:
enum DeviceType {
unknown(2),phone(4)
private final int value;
private DeviceType(int value) {
this.value = value;
}
public static DeviceType valueOf(int value) {
switch (value) {
case 2:
return unknown;
case 4:
return phone;
default:
return unknown;
}
}
public int value() {
return value;
}
}
public enum WeekDateEnum {
MON {
@Override
public WeekDateEnum nextDay() {
return TUES;
}
@Override
public WeekDateEnum preDay() {
return SUN;
}
},
TUES {
@Override
public WeekDateEnum nextDay() {
return WEDNES;
}
@Override
public WeekDateEnum preDay() {
return MON;
}
},
WEDNES {
//...
},
THURS {
//...
},
FRI {
//...
},
SATUR {
//...
},
SUN {
//...
};
private WeekDateEnum() {}
public abstract WeekDateEnum nextDay();
public abstract WeekDateEnum preDay();
/**
* 枚举对象公共的toString方法,也可以在定义枚举类时定义
*/
public String toString() {
switch (this) {
case MON:
return "WeekDateEnum.MON";
case TUES:
return "WeekDateEnum.TUES";
case WEDNES:
return "WeekDateEnum.WEDNES";
case THURS:
return "WeekDateEnum.THURS";
case FRI:
return "WeekDateEnum.FRI";
case SATUR:
return "WeekDateEnum.SATUR";
case SUN:
return "WeekDateEnum.SUN";
default:
return null;
}
}
}