Java基础15:深入理解Java枚举类
(本文参考了https://blog.csdn.net/a724888/article/details/80173457 )
枚举(enum)类型是Java 5新增的特性,存放在 java.lang 包中,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示。
引入枚举类
在程序设计中,有时会用到由若干个有限数据元素组成的集合,如一周内的星期一到星期日七个数据元素组成的集合,由三种颜色红、黄、绿组成的集合,一个工作班组内十个职工组成的集合等等,程序中某个变量取值仅限于集合中的元素。此时,可将这些数据集合定义为枚举类型。
因此,枚举类型是某类数据可能取值的集合,如一周内星期可能取值的集合为:
{ Sun,Mon,Tue,Wed,Thu,Fri,Sat}
该集合可定义为描述星期的枚举类型,该枚举类型共有七个元素,因而用枚举类型定义的枚举变量只能取集合中的某一元素值。由于枚举类型是导出数据类型,因此,必须先定义枚举类型,然后再用枚举类型定义枚举型变量。
enum <枚举类型名>
{
<枚举元素表> };
其中:关键词enum表示定义的是枚举类型,枚举类型名由标识符组成,而枚举元素表由枚举元素或枚举常量组成。例如:
enum weekdays
{
Sun,Mon,Tue,Wed,Thu,Fri,Sat };
定义了一个名为 weekdays的枚举类型,它包含七个元素:Sun、Mon、Tue、Wed、Thu、Fri、Sat。
在编译器编译程序时,给枚举类型中的每一个元素指定一个整型常量值(也称为序号值)。若枚举类型定义中没有指定元素的整型常量值,则整型常量值从0开始依次递增,因此,weekdays枚举类型的七个元素Sun、Mon、Tue、Wed、Thu、Fri、Sat对应的整型常量值分别为0、1、2、3、4、5、6。
注意:在定义枚举类型时,也可指定元素对应的整型常量值。
例如,描述逻辑值集合{
TRUE、FALSE}的枚举类型boolean可定义如下:
enum boolean
{
TRUE=1 ,FALSE=0 };
该定义规定:TRUE的值为1,而FALSE的值为0。
而描述颜色集合{
red,blue,green,black,white,yellow}的枚举类型colors可定义如下:
enum colors
{
red=5,blue=1,green,black,white,yellow};
该定义规定red为5 ,blue为1,其后元素值从2 开始递增加1。green、black、white、yellow的值依次为2、3、4、5。
此时,整数5将用于表示二种颜色red与yellow。通常两个不同元素取相同的整数值是没有意义的。枚举类型的定义只是定义了一个新的数据类型,只有用枚举类型定义枚举变量才能使用这种数据类型。
枚举语法
1.1 枚举类与普通类的相同点
enum 与 class、interface 具有相同地位;
可以继承多个接口;
可以拥有构造器、成员方法、成员变量;
1.2 枚举类与普通类不同之处
1、默认继承 java.lang.Enum 类,所以不能继承其他父类;其中 java.lang.Enum 类实现了 java.lang.Serializable 和 java.lang.Comparable 接口;
2、使用 enum 定义,默认使用 final 修饰,因此不能派生子类;
3、构造器默认使用 private 修饰,且只能使用 private 修饰;
4、枚举类所有实例必须在第一行给出,默认添加 public static final 修饰,否则无法产生实例;
枚举类的具体使用
这部分内容参考https://blog.csdn.net/qq_27093465/article/details/52180865
1、常量
在JDK1.5 之前,我们定义常量都是: public static final… 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
public enum Color {
RED, GREEN, BLANK, YELLOW
}
2、switch
JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。
enum Signal {
GREEN, YELLOW, RED
}
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {
case RED:
color = Signal.GREEN;
break;
case YELLOW:
color = Signal.RED;
break;
case GREEN:
color = Signal.YELLOW;
break;
}
}
}
3、向枚举中添加新方法
如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。