一、枚举的定义(JDK 5新增的 enum 关键字用于定义一个枚举类)
1、用enum定义类(枚举类)默认继承了java.lang.Enum类而不是继承了Object类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口。(enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。
2、枚举类的构造函数只能使用private访问修饰符,如果省略了其构造器的访问控制符,则系统会默认添加private修饰;
3、枚举类的所有实例必须在枚举类中显式列出,否则这个枚举类将永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无需程序员显式添加。
public enum Week {
MON{
public String toLocaleString(){
return "星期一";
}
},TUES{
public String toLocaleString(){
return "星期二";
}
},WEB{
public String toLocaleString(){
return "星期三";
}
},THUR{
public String toLocaleString(){
return "星期四";
}
},FRI{
public String toLocaleString(){
return "星期五";
}
},SAT{
public String toLocaleString(){
return "星期六";
}
},SUN{
public String toLocaleString(){
return "星期日";
}
};
public abstract String toLocaleString();
}
枚举的遍历
复制代码代码如下:
public class EnumTest {
public static void main(String[] args){
for(Week w:Week.values()){
System.out.println(w);
}
}
}
二、enum对象的常用方法
int compareTo(E o)
比较此枚举与指定对象的顺序。
Class<E>
getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。
String
name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。
int
ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
String
toString()
返回枚举常量的名称,它包含在声明中。
static
<T extends Enum<T>> T
valueOf(Class<T> enumType, String name)
返回带指定名称的指定枚举类型的枚举常量。
代码如下:
public class EnumTest {
public static void main(String[] args){
Week day =Week.FRI;
System.out.println(day);//FRI
System.out.println(day.name());//FRI
System.out.println(day.ordinal());//4
System.out.println(Week.valueOf("SUN").toLocaleString());//星期日
System.out.println(Week.values().length);//7 获取枚举长度
}
}
三、enum的构造函数
代码如下:
public enum Gender {
MALE("男"),FEMALE("女");
private String name;
private Gender(String name){
this.name =name;
}
public String getName(){
return this.name;
}
public String toString(){
String name = null;
switch(this){
case MALE:
name="男";
break;
case FEMALE:
name="女";
break;
}
return name;
}
}
枚举的综合应用示例:交通灯
复制代码代码如下:
public enum Lamp {
/*每个枚举元素各表示一个方向的控制灯*/
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),
/*下面元素表示与上面的元素的相反方向的灯,它们的“相反方向灯”和“下一个灯”应忽略不计!*/
N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),
/*由南向东和由西向北等右拐弯的灯不受红绿灯的控制,所以,可以假想它们总是绿灯*/
S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);
private Lamp(String opposite,String next,boolean lighted){
this.opposite = opposite;
this.next = next;
this.lighted = lighted;
}
/*当前灯是否为绿*/
private boolean lighted;
/*与当前灯同时为绿的对应方向*/
private String opposite;
/*当前灯变红时下一个变绿的灯*/
private String next;
public boolean isLighted(){
return lighted;
}
/**
* 某个灯变绿时,它对应方向的灯也要变绿
*/
public void light(){
this.lighted = true;
if(opposite != null){
Lamp.valueOf(opposite).light();
}
System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");
}
/**
* 某个灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿
* @return 下一个要变绿的灯
*/
public Lamp blackOut(){
this.lighted = false;
if(opposite != null){
Lamp.valueOf(opposite).blackOut();
}
Lamp nextLamp= null;
if(next != null){
nextLamp = Lamp.valueOf(next);
System.out.println("绿灯从" + name() + "-------->切换为" + next);
nextLamp.light();
}
return nextLamp;
}
}