资源描述
publicenumColor{
RED,BLUE,BLACK,YELLOW,GREEN
}
enum很像特殊class,事实上enum声明定义类型就是一种类
这些类都是库类中Enum类子类(Java.lang.Enum<E>),她们继承了Enum中许多有用办法
枚举值都是publicstaticfinal,也就是常量,因而,枚举类中枚举值应所有大写
枚举类型是class,在枚举类型中有构造器,办法和字段。但枚举构造器有很大不同:
1.构造器只是在构造枚举值时候被调用
2.构造器私有private,不容许有public构造器
3.枚举可以在switch语句中使用
枚举特点
1.用enum定义枚举类默认继承了Java.lang.Enum类而不是继承了Object类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口
2.枚举类构造函数只能使用private访问修饰符,如果省略了其构造器访问控制符,则默认使用private修饰;
3.枚举类所有实例必要在枚举类中显式列出,否则这个枚举类将永远都不能产生实例。列出这些实例时,系统会自动添加publicstaticfinal修饰,无需程序员显式添加。
代码如下:
publicenumWeek{
MON{
publicStringtoLocaleString{
return"星期一";
}
},TUES{
publicStringtoLocaleString{
return"星期二";
}
},WEB{
publicStringtoLocaleString{
return"星期三";
}
},THUR{
publicStringtoLocaleString{
return"星期四";
}
},FRI{
publicStringtoLocaleString{
return"星期五";
}
},SAT{
publicStringtoLocaleString{
return"星期六";
}
},SUN{
publicStringtoLocaleString{
return"星期日";
}
};
publicabstractStringtoLocaleString;
}
枚举遍历
代码如下:
publicclassEnumTest{
publicstaticvoidmain(Stringargs){
for(Weekw:Week.values){
System.out.println(w);
}
}
}
枚举惯用办法
intcompareTo办法
Stringname返回枚举实例名称
intordinal返回枚举值在枚举中索引
StringtoString返回枚举实例名称比name更惯用
publicstaticvalueOf
代码如下:
publicclassEnumTest{
publicstaticvoidmain(Stringargs){
Weekday=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获取枚举长度
}
}
枚举构造函数
代码如下:
publicenumGender{
MALE("男"),FEMALE("女");
privateStringname;
privateGender(Stringname){
this.name=name;
}
publicStringgetName{
returnthis.name;
}
publicStringtoString{
Stringname=null;
switch(this){
caseMALE:
name="男";
break;
caseFEMALE:
name="女";
break;
}
returnname;
}
}
枚举综合应用示例:交通灯
代码如下:
publicenumLamp{
/*每个枚举元素各表达一种方向控制灯*/
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);
privateLamp(Stringopposite,Stringnext,booleanlighted){
this.opposite=opposite;
this.next=next;
this.lighted=lighted;
}
/*当前灯与否为绿*/
privatebooleanlighted;
/*与当前灯同步为绿相应方向*/
privateStringopposite;
/*当前灯变红时下一种变绿灯*/
privateStringnext;
publicbooleanisLighted{
returnlighted;
}
/***某个灯变绿时,它相应方向灯也要变绿*/
publicvoidlight{
this.lighted=true;
if(opposite!=null){
Lamp.valueOf(opposite).light;
}
System.out.println(name+"lampisgreen,下面总共应当有6个方向能看到汽车穿过!");
}
/***某个灯变红时,相应方向灯也要变红,并且下一种方向灯要变绿*@return下一种要变绿灯*/
publicLampblackOut{
this.lighted=false;
if(opposite!=null){
Lamp.valueOf(opposite).blackOut;
}
LampnextLamp=null;
if(next!=null){
nextLamp=Lamp.valueOf(next);
System.out.println("绿灯从"+name+"-------->切换为"+next);
nextLamp.light;
}
returnnextLamp;
}
}
展开阅读全文