枚举的定义
枚举类型的每一个值都将映射到protected Enum(String name, int ordinal)构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
public enum SizeEnum { SMALL,MEDIUM,LAGRE,EXTRA_LAGRE; }这段代码实际上调用了4次 Enum(String name, int ordinal)
new Enum<SizeEnum>("SMALL",0); new Enum<SizeEnum>("MEDIUM",1); new Enum<SizeEnum>("LAGRE",2); new Enum<SizeEnum>("EXTRA_LAGRE",3);
枚举的常用方法
static Enum valueOf(Class enumClass, String name)
返回指定名字、给定义的枚举常量。
String name()
返回枚举常量的名称
String toString()
返回枚举的常量名称 比name更常用。
int ordinal()
返回枚举值在枚举中的位置(索引),从0开始。
int compareTo(E other)
如果返回枚举常量在other之前,则返回一个负值;如果this==other,则返回0;否则返回正常值。枚举常量出现的次序在enum声明中给出。
下面是个例子:
public static void main(String[] args){ Size size =Size.MEDIUM; System.out.println(size);//MEDIUM System.out.println(size.name());//MEDIUM System.out.println(size.ordinal());//1 System.out.println(Size.valueOf("MEDIUM").toString());//MEDIUM System.out.println(Size.values().length);//4 获取枚举长度 }
枚举的遍历
public static void main(String[] args){ for(Size size:Size.values()){ System.out.println(size); } }
枚举的EnumSet,EnumMap 的应用
public class Test { public static void main(String[] args) { // EnumSet的使用 EnumSet<SizeEnum> sizeSet = EnumSet.allOf(SizeEnum.class); for (SizeEnum size : sizeSet) { System.out.println(size); } // EnumMap的使用 EnumMap<SizeEnum, String> sizeMap = new EnumMap(SizeEnum.class); sizeMap.put(SizeEnum.SMALL, "S号"); sizeMap.put(SizeEnum.MEDIUM, "M号"); sizeMap.put(SizeEnum.LAGRE, "L号"); sizeMap.put(SizeEnum.EXTRA_LAGRE, "XL号"); System.out.println(sizeMap+"-----sizeMap"); // 循环输出EnumMap值 for (Iterator<Entry<SizeEnum, String>> iter = sizeMap.entrySet().iterator(); iter.hasNext();) { Entry<SizeEnum, String> entry = iter.next(); System.out.println(entry.getKey().name() + ":" + entry.getValue()); } } }enum 经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum<E>。
枚举特点
1.用enum定义枚举类默认继承了java.lang.Enum类而不是继承了Object类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口。
2.枚举类的构造函数只能使用private访问修饰符,如果省略了其构造器的访问控制符,则默认使用private修饰。
3.枚举类的所有实例必须在枚举类中显式列出,否则这个枚举类将永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无需程序员显式添加。
4.枚举类型的变量值能存储这个类型声明中给定的某个枚举值或者null值,null表示这个变量没有设置任何值。
5.如果比较两个枚举类型de值,永远不要调用equals,直接使用“==”就可以了。
6.枚举也可以像一般的类一样添加方法和属性,可以为它添加静态和非静态的属性或方法。
例如:
public enum Gender { MALE("男"), FEMALE("女"); private String name; private Gender(String name) { this.name = name; } public String getName() { return this.name; } public String toString() { String name = null; switch (this) { case MALE: name = "男"; break; case FEMALE: name = "女"; break; } return name; } }
转载于:https://www.cnblogs.com/iCcccy/p/4663695.html