------Java培训、Android培训、iOS培训、Net培训、期待与您交流! -------
一、枚举的概述
枚举在Java语言中的作用很大,它可以对类似的相同类型的对象同时进行声明,在程序中调用这些元素时,不会出现混淆和重复。由于枚举的统一性,使得我们编写的代码量大大减少,同时也增加了程序的阅读性和可修改性。Java5新增了一个enum的关键字,用以定义枚举类。
枚举类一般的定义语法格式如下:
例如:举一个例子,比如设枚举名为weekday,枚举值有7个,即一周的7天。则凡被说明为weekday类型的变量取值,只能是这7天中的某一天。枚举变量有三种说明方式,我们可以采取任意一种方式进行说明:
示例:关于颜色类的例子
//创建关于Color类的枚举
enum Color {RED ,YELLON , BLUE;}
public class TextColor {
public static void main(String[] args) {
Color t = Color.BLUE;
//调用Color类对象
System.out.println(t);
}
}
运行结果:
BLUE
二、枚举类和枚举关键字
枚举类型的出现,有助于简洁程序的代码量,减少出错率。在大多数情况下,枚举类和枚举关键字是相互依存的。
(1)枚举类
枚举类是在java.lang包下的一个公共类,它的作用是用来构造新的枚举类型。这是JDK 1.5之后Java推出的一个新的类,用来完善枚举这一常用集合在Java中的不足。在JDK API中我们可以看到,enum类定义了大约十多个方法。我们简要的介绍一下这些方法:
示例:
public class TextColor {
//创建关于Sex类的枚举
public static enum Sex {
MALE , FEMALE
}
public static void main(String[] args) {
//返回枚举变量的名称
System.out.printf("Sex.FEMALE.toString(): \t%n %s", Sex.FEMALE.toString());
//返回枚举变量在Sex中的位置
System.out.printf("Sex.FEMALE.ordinal(): \t%s %n", Sex.FEMALE.ordinal());
//返回枚举变量的类信息
System.out.printf("Sex.FEMALE.getClass(): \t%s %n", Sex.FEMALE.getClass());
System.out.println("%n遍历所有的Sex枚举变量:");
//对枚举类型进行遍历
for (Sex sex : Sex.values()) {
System.out.printf("%s," , sex);
}
switch (Sex.FEMALE) {
case MALE:
break;
case FEMALE:
break;
default:
}
}
}
运行结果:
Sex.FEMALE.toString(): FEMALE
Sex.FEMALE.ordinal(): 1
Sex.FEMALE.getClass(): class TextColor$Sex
%n遍历所有的Sex枚举变量:
MALE,FEMALE,
(2)枚举关键字
相对于枚举类,枚举关键字(enum关键字)则是定义的一个枚举类型。实际上,在此次定义的过程中,通过enum关键字相当于定义了一个类,并且此类将继承enum类。
示例:
//创建关于Sex类的枚举
enum Color{ RED , YELLOW , BLUE;}
public class TextColor {
public static void main(String[] args) {
//对枚举类型进行遍历
for (Color c : Color.values()) {
//调用name()和ordinal方法输出编号
System.out.println(c.name()+"编号"+c.ordinal());
}
}
}
运行结果:
RED编号0
YELLOW编号1
BLUE编号2
而枚举类与枚举关键字的区别就是可以直接调用Java中受保护的enum类的构造方法。
三、枚举的构造方法、接口和抽象方法
枚举的使用非常灵活。枚举可以应用于代码中的各个角落 ,只要定义的对象具有枚举的形式,均可以使用枚举对其定义,这样在减少代码量的同时,也增加了代码的可读性和可操作性。我们下面分别对枚举的构造方法、接口和抽象方法作一简要说明。
(1)枚举的构造方法
在枚举中可以直接定义构造方法。但要注意的是:一旦构造方法定义之后,则所有的枚举对象都必须明确调用此构造方法。
示例:定义两个构造方法getName()和setName()来获取和修改枚举元素。
public enum Color{ RED("红色") , YELLOW("黄色"), BLUE("蓝色");}
private String name;
//构造getName方法
public String getName() {
return name;
}
//构造setName方法
public void setName(String name) {
this.name = name;
}
(2)枚举的接口
当一个枚举实现一个接口之后,各个枚举对象都必须分别实现接口中的抽象方法。
示例:
//创建一个接口Dome
interface Dome{
//声明一个getColor()方法
public String getColor() {
}
}
//如何一个对象必须分别实现接口中的抽象方法
enum Color implements Dome{
RED{
public String getColor() {
return "红色";
}
},
YELLOW{
public String getColor() {
return "黄色";
}
},
BLUE{
public String getColor() {
return "蓝色";
};
}
}
public class TextColor {
public static void main(String[] args) {
//对枚举类型进行遍历
for (Color c : Color.values()) {
System.out.println(c.ordinal()+" —— "+c.name()+ ":"+ c.getColor());
}
}
}
运行结果:
0 —— RED:红色
1 —— YELLOW:黄色
2 —— BLUE:蓝色
(3)枚举的抽象办法
我们可以通过枚举实现接口,同样,Java也可以在枚举中直接定义抽象方法。并且在一个枚举中可以定义一个或多个抽象方法。同样要注意的是:枚举中的每个对象都必须单独地实现此方法。
示例:
//如何一个对象必须分别实现接口中的抽象方法
enum Color {
RED{
public String getColor() {
return "红色";
}
},
YELLOW{
public String getColor() {
return "黄色";
}
},
BLUE{
public String getColor() {
return "蓝色";
}
};
//定义抽象办法
public abstract String getColor();
}
public class TextColor {
public static void main(String[] args) {
//对枚举类型进行遍历
for (Color c : Color.values()) {
System.out.println(c.ordinal()+" —— "+c.name()+ ":"+ c.getColor());
}
}
}
运行结果:
0 —— RED:红色
1 —— YELLOW:黄色
2 —— BLUE:蓝色