枚举的深入理解
ps:没有研究就没有发言权,所以我爱思考!
1.枚举类型是一种取值被严格限定在一个有限的集合中的变量类型。
2.java中的枚举是一种特殊的类。每一个枚举都会被编译成一个class文件。
3.枚举主要用于限定变量的取值,从而从根源上有效的避免了非法的赋值。
4.声明一个枚举:
public enum Sex{
MALE,FEMALE
}
可以声明在一个类的内部,也可以声明在一个单独的文件里。
若声明在一个类的内部,则会被编译为 :
类名$Sex.class。
证明这时enum是以内部类的形式存在。
相信很多人不明白MALE,FEMALE到底是什么类型。请看这句代码:
Sex sex = Sex.MALE;
只有相同类型才可以赋值。枚举是一种特殊的类,那么sex就是一个类的引用,那么MALE必定也是一个类的引用。以下代码进一步证明了这一点。
Sex.FEMALE.name();
因为只有类才可以调用方法。
所以在声明一个enum的时候只需要指定引用变量的名字,系统就会自动创建对象,并把地址返回给你定义的引用变量。
5.下面我们来模拟enum
public enum Weekday{SUN(1){//用匿名内部类创建实例@Overridepublic Weekday nextday() {return MON;///这里更进一步说明了,MON是Weekday类型的引用}},///两个枚举的取值之间用','MON{@Overridepublic Weekday nextday() {return TUE;}},TUE{@Overridepublic Weekday nextday() {return WED;}},WED{@Overridepublic Weekday nextday() {return THUR;}},THUR{@Overridepublic Weekday nextday() {return FRI;}},FRI{@Overridepublic Weekday nextday() {return SAT;}},SAT{@Overridepublic Weekday nextday() {return MON;}};///最后一个用‘;’///定义了一个抽象方法,//则在创建Weekday的时候就必须实现该抽象方法public abstract Weekday nextday();private Weekday(){}private Weekday(int i){}}但是我们并不建议这样使用enum,这样会增加系统消耗。因为这样会生成7个匿名内部类的class文件,形如:
Weekday$1.class
Weekday$2.class
在开发的时候,我们会更多地使用基本类型来代替enum。