Java枚举类型的原理

转载自:http://blog.youkuaiyun.com/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$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;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值