1、枚举概述
1.1、什么是枚举
枚举,英文:Enumeration
“枚举”的字面意思:枚,是个量词,可以理解成是个。比如:一枚金牌、一枚银牌。举:就是例举的意思。枚举合起来的意思就是例举出有限的事物的集合!例如:例举一周有几天、一年有多少个月份。
枚举的正式解释:枚举类型是jdk5中新增的特性,它是一种加了限制的特殊的class类型。这里的限制指的是对枚举类型所能创建的对象的个数进行了限制!他不像普通的class类那样可以创建无数的对象,他只能创建固定数目的对象,而且这些对象是在定义枚举类型的时候就已经在枚举类内部创建好了的!
1.2、为什么要用枚举?
因为在有的时候一个类的对象是有限且固定的,所以这个时候用枚举就很方便!
例如:一周有七天、一年有四季
不用枚举(JDK1.5之前)
代码语言:javascript复制public class Week{
private Week(){}//私有构造器
public static final Week SUN = new Week();
public static final Week MON = new Week();
public static final Week TUE = new Week();
public static final Week WED = new Week();
public static final Week THU = new Week();
public static final Week FRI = new Week();
public static final Week SAT = new Week();
}
使用枚举(JDK1.5之后)
代码语言:javascript复制public enum WeekEnum {
SUN,MON,TUE,WED,THU,FRI,SAT;
}
2、枚举的使用
2.1、枚举的定义
枚举的定义其实和类的定义是一样的,只是关键字不一样,定义枚举的关键字是enum
代码语言:javascript复制//定义一个类
public class 类名称{
//类成员
}
//定义了一个星期的枚举类
public enum WeekEnum {//class
//枚举对象
SUN,MON,TUE,WED,THU,FRI,SAT;//object -->枚举常量
}
代码语言:javascript复制public class Week{
private Week(){}//私有构造器
public static final Week SUN = new Week();
public static final Week MON = new Week();
public static final Week TUE = new Week();
public static final Week WED = new Week();
public static final Week THU = new Week();
public static final Week FRI = new Week();
public static final Week SAT = new Week();
}
注意事项:
(1)、枚举值都定义在枚举类中。
(2)、枚举常量值的书写要遵循Java标识符的规范,一般都是全部大写。
(3)、定义的枚举值和枚举值之间用“,”隔开,定义完所有的枚举值之后要加";"。
(4)、每一个枚举值都是一个常量,定义之后都不能更改!
(完结)
2.2、枚举对象的使用
代码语言:javascript复制public enum WeekEnum {
SUN,MON,TUE,WED,THU,FRI,SAT;
}
代码语言:javascript复制public static void main(String[] args){
WeekEnum day =WeekEnum.MON;//枚举类名 枚举对象名 = 枚举类名.枚举常量名
System.out.println(day);//枚举常量的表现形式
}
2.3、枚举类的简单练习
定义一个季节的枚举类,并使用该枚举类
代码语言:javascript复制public enum Season{
SPRING,SUMMER,AUTUMN,WINTER;
}
public static void main(String[] args){
//直接引用
Season s =Season.SPRING;
System.out.println(s);//Spring
}
定义一个月份的枚举类,并使用该枚举类
代码语言:javascript复制public enum Month{ January,February,March,April,May,June,July,August,September,October,November,December;
}
public static void main(String[] args){
//直接引用
Month m =Month.December;
System.out.println(m);//Spring
}
3、枚举原理
所有的枚举类其实默认是继承Enum类,也就是我们声明一个枚举类,他默认就继承Enum类。我们不能再用枚举类继承其他的类,但可以用枚举类实现接口。如下图所示:
枚举类不能继承,因为枚举默认继承Enum类
枚举可以实现接口
3.1、Enum抽象类常见方法
方法 | 方法说明 |
---|---|
String name() | 返回此枚举常量的名称,在其枚举声明中对其进行声明 |
static Enum valueOf(String name) | 返回带指定名称的指定枚举类型的枚举常量 |
int ordinal() | 返回枚举常量的序数(初始常量序数为零) |
String toString() | 返回枚举常量的名称,它包含在声明中 |
static Enum[] values() | 返回该枚举中所有枚举常量的数组 |
代码演示
代码语言:javascript复制 Week mon = Week.MON;
System.out.println(mon.name());//返回枚举常量的字符串名称
Week tue = Week.valueOf("TUE");//返回枚举常量
System.out.println(tue); //相当于调用tue.toString()方法
Week[] values = Week.values();//返回Week中的所有的枚举常量
System.out.println(Arrays.toString(values));
int index = tue.ordinal();//返回该枚举常量在枚举类中的索引
System.out.println(index);
运行结果:
3.2、枚举类的成员
前面我们说了,枚举类就是一个特殊的类,特殊的地方在于枚举类的对象是有限的?那么枚举类能不能像普通的类一样,可以有构造器、成员变量、成员方法呢?
答案是肯定的!
3.2.1、无参构造
枚举类和普通的类一样,如果没有为其添加构造方法的话,他默认是有一个无参构造方法。和普通类不同的是,枚举类的构造方法的访问权限修饰符必须是private!
3.2.2、带参构造
代码语言:javascript复制public enum Week{
SUN("周日"),
MON("周一"),
TUE("周二"),
WED("周三"),
THU("周四"),
FRI("周五"),
SAT("周六");
//定义成员变量
private String chineseName;
//带参的构造函数
private Week(String chineseName){
this.chineseName=chineseName;
};
//定义成员方法
//获取枚举值对应的中文名称
public String getChineseName(){
return chineseName;
}
}
代码语言:javascript复制public class TestWeek {
public static void main(String[] args) {
Week mon = Week.MON;
System.out.println(mon);
System.out.println(mon.getChineseName());
}
}
运行结果
3.3、为枚举类添加接口
代码语言:javascript复制//方式一:
//枚举实现接口,并实现接口方法
public enum Week implements enumInter {
SUN,MON,TUE,WED,THU,FRI,SAT;
@Override
public void method() {
System.out.println("我是枚举中的接口");
}
}
interface enumInter{
public abstract void method();
}
代码语言:javascript复制//方式二
//枚举类不实现抽象类中的方法,而让每个枚举常量以==匿名内部类==的方式实现
public enum Week implements enumInter {
SUN{
@Override
public void method() {
System.out.println("我是周日");
}
},
MON{
@Override
public void method() {
System.out.println("我是周一");
}
};
}
interface enumInter{
public abstract void method();
}
4、枚举集合类EnumSet和EnumMap
4.1、EnumSet
此枚举集合类EnumSet实现了Set集合接口,是一个抽象类,他可以将一个枚举类转换成一个Set集合!
具体转换操作如下所示!
代码语言:javascript复制public enum Week {
SUN,MON,TUE,WED,THU,FRI,SAT;
}
public class TestWeek {
public static void main(String[] args) {
EnumSet<Week> set = EnumSet.allOf(Week.class);
for (Week w:set) {
System.out.println(w);
}
}
}
运行结果如下
4.2、EnumMap
此枚举集合类EnumMap实现了Map集合接口,他可以将一个枚举类转换成一个Map集合!
其中键是枚举常量,值是字符串类型
具体转换操作如下所示!
代码语言:javascript复制//创建枚举类Week
public enum Week {
SUN,MON,TUE,WED,THU,FRI,SAT;
}
public class TestWeek {
public static void main(String[] args) {
//创建EnumMap集合
//键:Week枚举常量
//值:对该常量的字符串描述
EnumMap<Week,String> map = new EnumMap<Week, String>(Week.class);
//添加集合元素
map.put(Week.MON,"周一");
map.put(Week.TUE,"周二");
//遍历集合
Set<Map.Entry<Week, String>> entries = map.entrySet();
for (Map.Entry<Week, String> entry:entries) {
System.out.println("key:" entry.getKey() " value:" entry.getValue());
}
}
}
运行结果如下: