Java枚举类型的原理

来源:互联网 发布:单词带读软件 编辑:程序博客网 时间:2024/05/29 17:40
转载自:http://blog.csdn.net/tanggao1314/article/details/53150298

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$1class com.lxq.enumm.Colorclass java.lang.Enumpublic 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 {@Overridepublic WeekDateEnum nextDay() {return TUES;}@Overridepublic WeekDateEnum preDay() {return SUN;}},  TUES {@Overridepublic WeekDateEnum nextDay() {return WEDNES;}@Overridepublic 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;}}}
0 0
原创粉丝点击