Java学习之枚举 Enum

一,语法(定义)

    创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。

枚举(enum),是指一个经过排序的、被打包成一个单一实体的项列表。

个人理解,枚举里的各个组成个体,都是一个简单的Enum实体. 

这种是简单类型:enum里的MONDAY相当于Enum("MONDAY",0);以此类推

public enum Day {
	MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

还有就是带有构造方法的复杂类型:该enum里的RED还是相当于Enum("RED",0),但是该类型还可以调用该类里的方法获取到构造器里的内容:比如Color.RED.getName()就能获取"红色";从中可以看出每个个体都使用到类的方法,也可以重写公用的方法,具体可在个体里面重写方法体,下面的yellow()方法就可以看出是重写的

Color.YELLO.yellow();  ----->woshi yello
Color.RED.yellow();----->我们不一样

public enum Color {
	RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3){
		void yellow(){
			System.out.println("woshi blank");
		}
	}, YELLO("黄色", 4){
		void yellow(){
			System.out.println("woshi yello");
		}
	};
    
    
    private String name ;
    private int index ;
     
    private Color( String name , int index ){
        this.name = name ;
        this.index = index ;
    }
     
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getIndex() {
        return index;
    }
    public void setIndex(int index) {
        this.index = index;
    }
    void yellow(){
		System.out.println("我们不一样");
	}

总结:这两种方式共同点都可以调用Enum类里的方法,不同点是复杂的enum类也可以调用自己封装的方法.

枚举是从jdk1.5版本支持的,使用是为了更加方便代码的管理和维护,是常量类的加强版,单例性.

使用案例:

	public static void main(String[] args)  {
		System.out.println(Color.YELLO.ordinal());
		Color red=Color.RED;
		System.out.println(red instanceof Enum);
		System.out.println(red);
		System.out.println(red.values().length);
		Color valueOf = Color.valueOf("RED");
		System.out.println(valueOf.getName());
		Color[] values = Color.values();
		for(Color c:values){
			Class<Color> declaringClass = c.getDeclaringClass();
			System.out.println(declaringClass);
			System.out.println(c instanceof Enum );
			System.out.println(c.getIndex()+"---------------"+c.getName());
		}
		Color.YELLO.yellow();
		Color.RED.yellow();
		Color.showColor(Color.YELLO);
		System.out.println(Day.FRIDAY.name());
	}

结果:

3
true
RED
4
红色
class app.thread.Color
true
1---------------红色
class app.thread.Color
true
2---------------绿色
class app.thread.Color
true
3---------------白色
class app.thread.Color
true
4---------------黄色
woshi yello
我们不一样
YELLO
FRIDAY

EnumMap:该Map主要就是为枚举使用实现的功能类.该Map的key必须是属于枚举类的类型,且key不能为空,但是value是可以为空的,且EnumMap实例化后,里面存储的数据是已数组来存储的,数组的长度是传入枚举类型里面个体的长度.下图是构造器


put方法


get()方法:主要由

isValidKey(key):该方法就是判断key是不是空或者是不是属于该枚举类,true则能查到值,false则返回null.

unmaskNull(vals[((Enum<?>)key).ordinal()]):该方法是把Map里的值取到后判断是不是封装的NULL,是的话则返回null不是则返回正常值




猜你喜欢

转载自blog.csdn.net/zxf_0601/article/details/80255887