Java基础知识07--枚举类型Enum的使用
1.枚举的概述
JDK1.5引入了新的类型——枚举。
Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum>,而 E 表示枚举类型的名称。
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:
- values() 返回枚举类中所有的值。
- ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
- valueOf()方法返回指定字符串值的枚举常量。
2.枚举型常量
枚举类:
public enum SeasonEnum { //每个成员变量都是final static修饰 SPRING,SUMMER,AUTUMN,WINTER }
测试类:
public class SeasonTest { public static void main(String[] args) { for (SeasonEnum seasonEnum : SeasonEnum.values()) { System.out.println(seasonEnum+",ordinal:"+seasonEnum.ordinal()+",name:"+seasonEnum.name()); } } }
控制台输出:
SPRING,ordinal:0,name:SPRING SUMMER,ordinal:1,name:SUMMER AUTUMN,ordinal:2,name:AUTUMN WINTER,ordinal:3,name:WINTER
3.带一个参数的枚举
SeasonEnum 枚举类有了chinese这个成员变量,所以我们在定义实例对象时就要维护这个chinese成员变量。
枚举类:
public enum SeasonEnum { //枚举类的实例对象必须在最前面先定义,而且必须每个实例对象都必须维护上chinese成员变量 SPRING("春天"),SUMMER("夏天"),AUMUTN("秋天"),WINTER("冬天"); private String chinese; //枚举类型的构造函数默认为private,因为枚举类型的初始化要在当前枚举类中完成。 SeasonEnum (String chinese){ this.chinese= chinese; } public String getChinese(){ return chinese; } }
测试类:
public class SeasonTest { public static void main(String[] args) { //直接初始化 SeasonEnum season1 = SeasonEnum.SPRING; //调用SeasonEnum枚举类的getChinese()方法获取SPRING的中文值 System.out.println(season1.getChinese()); } }
控制台输出:
春天
4.带两个参数的枚举
在枚举类中增加了name/code两个属性,并重新编写了构造方法。
枚举类:
public enum SeasonEnum { //枚举类的实例对象必须在最前面先定义 SPRING("春天",1201), SUMMER("夏天",1202), AUMUTN("秋天",1203), WINTER("冬天",1204); private String name; private Integer code; //枚举类型的构造函数默认为private,因为枚举类型的初始化要在当前枚举类中完成。 SeasonEnum (String name,Integer code){ this.name=name; this.code=code; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } @Override public String toString() { return this.name()+"("+this.code+")"; } }
测试类:
public class SeasonTest { public static void main(String[] args) { //直接初始化 SeasonEnum season1 = SeasonEnum.SPRING; System.out.println(season1.getName()); System.out.println(season1.toString()); } }
控制台输出:
春天
SPRING(1201)
5.枚举类中定义抽象方法
既然编译器最终将每个枚举值声明为枚举类的实例,那我们能在枚举类中声明抽象方法让枚举值去实现么?
在枚举类Season中声明了一个抽象方法sayHello()。然后在创建枚举值时,就必须实现该抽象方法。
枚举类:
public enum SeasonEnum { //枚举类的实例对象必须在最前面先定义,而且必须每个实例对象都必须维护上chinese成员变量 SPRING("春天",1201){ @Override void sayHello() { System.out.println("hello spring"); } }, SUMMER("夏天",1202){ @Override void sayHello() { System.out.println("hello summer"); } }, AUTUMN("秋天",1203){ @Override void sayHello() { System.out.println("hello autumn"); } }, WINTER("冬天",1204){ @Override void sayHello() { System.out.println("hello winter"); } }; private String name; private Integer code; //枚举类型的构造函数默认为private,因为枚举类型的初始化要在当前枚举类中完成。 SeasonEnum (String name,Integer code){ this.name=name; this.code=code; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } abstract void sayHello(); }
测试类:
public class SeasonTest { public static void main(String[] args) { //直接初始化 SeasonEnum season1 = SeasonEnum.SPRING; //调用SeasonEnum枚举类的sayHello方法 season1.sayHello(); } }
控制台输出:
hello spring
参考文献:https://blog.csdn.net/qq_27093465/article/details/52180865
https://blog.csdn.net/sihai12345/article/details/81070174(重点参考)
https://zhuanlan.zhihu.com/p/64605561