枚举特点
1.用enum定义枚举类默认继承了java.lang.Enum类而不是继承了Object类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口
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); } } }
枚举的常用方法
int compareTo方法
String name()返回枚举实例的名称
int ordinal() 返回枚举值在枚举中的索引
String toString()返回枚举的实例名称 比name更常用
public static valueOf()
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 获取枚举长度 } }
枚举的构造函数
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; } }
枚举的综合应用示例:交通灯
1 public enum Lamp { 2 /*每个枚举元素各表示一个方向的控制灯*/ 3 S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false), 4 /*下面元素表示与上面的元素的相反方向的灯,它们的“相反方向灯”和“下一个灯”应忽略不计!*/ 5 N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false), 6 /*由南向东和由西向北等右拐弯的灯不受红绿灯的控制,所以,可以假想它们总是绿灯*/ 7 S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true); 8 9 private Lamp(String opposite,String next,boolean lighted){ 10 this.opposite = opposite; 11 this.next = next; 12 this.lighted = lighted; 13 } 14 15 16 /*当前灯是否为绿*/ 17 private boolean lighted; 18 /*与当前灯同时为绿的对应方向*/ 19 private String opposite; 20 /*当前灯变红时下一个变绿的灯*/ 21 private String next; 22 public boolean isLighted(){ 23 return lighted; 24 } 25 26 /** 27 * 某个灯变绿时,它对应方向的灯也要变绿 28 */ 29 public void light(){ 30 this.lighted = true; 31 if(opposite != null){ 32 Lamp.valueOf(opposite).light(); 33 } 34 System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!"); 35 36 } 37 38 /** 39 * 某个灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿 40 * @return 下一个要变绿的灯 41 */ 42 public Lamp blackOut(){ 43 this.lighted = false; 44 if(opposite != null){ 45 Lamp.valueOf(opposite).blackOut(); 46 } 47 48 Lamp nextLamp= null; 49 if(next != null){ 50 nextLamp = Lamp.valueOf(next); 51 System.out.println("绿灯从" + name() + "-------->切换为" + next); 52 nextLamp.light(); 53 } 54 return nextLamp; 55 } 56 }