java中枚举的详细使用介绍
程序员文章站
2023-12-15 10:29:46
枚举特点
1.用enum定义枚举类默认继承了java.lang.enum类而不是继承了object类。其中java.lang.enum类实现了java.lang.seri...
枚举特点
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;
}
}
枚举的综合应用示例:交通灯
复制代码 代码如下:
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;
}
}