先用普通类模仿一下枚举,
采用抽象方法nextDay()将大量的if else语句转移成了一个个独立的类
如果想在一个类中编写完各个枚举类和测试调用类,那么就可以将枚举类定义成调用类的内部类
测试类WeekDay
<span style="color:#333399;"><span style="color:#333399;">package cn.itcast.day1;
public abstract class WeekDay {
private WeekDay(){}
public final static WeekDay SUN=new WeekDay(){
//内部类:是WeekDay的子类
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return SUN;
}
};
public final static WeekDay MON=new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return MON;
}
};
public final static WeekDay TUES=new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return TUES;
}
};
public final static WeekDay WED=new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return WED;
}
};
public final static WeekDay THUR=new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return THUR;
}
};
public final static WeekDay FRI=new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return FRI;
}
};
public final static WeekDay SAT=new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return SAT;
}
};
public abstract WeekDay nextDay();
/*public WeekDay nextDay(){
if(this==SUN){
return MON;
}else{
return TUES;
}
}*/
public String toString(){
return this==SUN?"SUN":"MON";
}
}</span></span>
类EumTest
<span style="font-size:24px;"><span style="font-size:24px;">package cn.itcast.day1;
public class EnumTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
WeekDay weekDay=WeekDay.MON;
// int weekDay=0; //通常把星期天用0表示
System.out.println(weekDay.nextDay());
}
}</span></span>
带有构造方法,抽象方法的枚举
<span style="font-size:24px;"><span style="font-size:24px;">package cn.itcast.day1;
public class EnumTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
/* WeekDay1 weekDay=WeekDay1.MON;
//int weekDay=0; //通常把星期天用0表示
System.out.println(weekDay.nextDay());*/
WeekDay weekDay2=WeekDay.WED;
System.out.println(weekDay2);
System.out.println(weekDay2.name());
System.out.println(weekDay2.ordinal());
System.out.println(WeekDay.values().length);
System.out.println(WeekDay.valueOf("SUN").toString());
//new Date(300){};
TrafficLamp red=TrafficLamp.RED;
System.out.println(red.nextLamp());
}
public enum WeekDay{
SUN(10),MON,TUE,WED,THI,FRI,SAT,YAN;
/*枚举的构造方法必须位于参数列表后面,并且必须是private类型的,
上面定义了2个构造方法,一个带参数,一个不带参数。
默认情况下执行的是不带参数的,如果想执行带参数的,
可以再上面的某个参数后面带一个参数,例如SUN(1),
其中MON()没带参数,依然执行第一个构造方法。*/
private WeekDay(){System.out.println("first");}
private WeekDay(int day){System.out.println("second");}
}
public enum TrafficLamp{
RED(30){
public TrafficLamp nextLamp(){
//先前用public abstract TrafficLamp nextLamp()
//所以一直报错,没有找到原因
return GREEN;
}
},
GREEN(50){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(3){
public TrafficLamp nextLamp(){
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){
this.time=time;
}
}
}</span><span style="font-size: 32px;">
</span></span>
代码解释:YELLOW表示枚举中的一个对象。后面的大括弧表示此对象有TrafficLamp的子类去实现
</pre><pre name="code" class="java">