java枚举类型enum
枚举类型是java 5新增特性的一部分,是一种特殊的数据类型(既是一种类类型但是又比类类型多些特殊的约束)
枚举定义的方式:
1public enum Day{ 2 MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY 3}
定义枚举类型使用的关键字是enum,与class类似。一般枚举类型的值都是大写的字母,多个值之间以逗号分隔。
枚举类型可以单独的定义,也可以定义在其他类内部。
使用方式:
最简单的就是枚举值的直接引用
1public static void main(String[] args){ 2 Day day = day.MONDAY; 3}
实现原理
在使用enum关键字创建枚举类型并编译后,编译器会生成一个相关的类,这个类继承了java API中的java.lang.Enum类。
也就是说实际enum枚举类型是一个继承java.lang.Enum的类。枚举类型中的枚举值,编译后其实都枚举类型的对象,在静态块中初始化。
Enum抽象类的常见方法
int compareTo(E o) 比较此枚举与指定对象的顺序,返回该枚举序号减去指定枚举序号
boolean equals(Object o) 当指定对象等于此枚举常量时,返回true
Class<?> getDeclaringClass() 返回与此枚举常量的枚举类型相对应的Class
String name() 返回此枚举常量名称
int ordinal() 返回枚举常量的序数(初始为0)
String toString() 返回枚举常量的名称
static<T extends Enum<T>> T static valueOf(Class<T> enumType,String name) 返回带指定名称的指定枚举类型的枚举常量
枚举类型继承Enum,编译后生成values(),values()方法的作用就是获取枚举类中的所有变量,并作为数组返回
valueOf(String name) 与Enum类中的方法类似,获取对应的枚举对象
枚举类型的进阶使用
枚举类型本质上来说就是一个类,也可以跟普通类一样,定义构造方法、成员变量、普通方法,也可以重写Enum的方法。
此外,还可以定义抽象方法,使具体枚举值实现抽象方法,以便产生不同行为。
1public enum EnumDemo{ 2 FIRST{ 3 public String getInfo(){ 4 return "FIRST TIME"; 5 } 6}, 7 8SECOND{ 9 public String getInfo(){ 10 return "SECOND TIME"; 11 } 12} 13 14 //定义抽象方法 15 public abstract String getInfo(); 16}
由于单继承的原因,enum类不能再继承其他类,但不妨碍它实现接口,因此enum类同样可以实现多接口。
1interface food{ 2 void eat(); 3} 4 5interface sport{ 6 void run(); 7} 8 9public enum EnumDemo2 implements food,sport{ 10 FOOD, 11 SPORT, 12 ; //这里有分隔符 13 14 15 @Override 16 public void eat(){ 17 System.out.println("eat....."); 18 } 19 20 @Override 21 public void run() { 22 System.out.println("run....."); 23 } 24 25}
枚举与switch
switch对枚举类型也进行了支持
1enum Color {GREEN,RED,BLUE} 2 3public class EnumDemo4 { 4 5 public static void printName(Color color){ 6 switch (color){ 7 case BLUE: //无需使用Color进行引用 8 System.out.println("蓝色"); 9 break; 10 case RED: 11 System.out.println("红色"); 12 break; 13 case GREEN: 14 System.out.println("绿色"); 15 break; 16 } 17 } 18 19 20 public static void main(String[] args){ 21 printName(Color.BLUE); 22 printName(Color.RED); 23 printName(Color.GREEN); 24 } 25}