----------------- android培训、java培训、期待与您交流! -----------------
枚举
1,枚举存在的意义。
当要定义星期几或性别的变量,该怎么定义。假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday=0;
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时候就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这个目标。
2,用普通类模拟枚举的实现原理。
package enum_test;
//模拟枚举
public abstract class WeekDay {
private WeekDay() {
}
//把复杂的if else 语句抽象成两个匿名内部类。记住这个思想。
public final static WeekDay SUN = new WeekDay(){
@Override
public WeekDay nextDay() {
return MON;
}
};
public final static WeekDay MON = new WeekDay(){
@Override
public WeekDay nextDay() {
return SUN;
}
};
//用抽象方法定义nextDay就将大量的 if else 语句转移成了一个个独立的类。
public abstract WeekDay nextDay() ;
// if (this == SUN) {
// return MON;
// } else {
// return SUN;
// }
public String toString() {
return this == SUN ? "SUN" : "MON";
}
}
3,枚举的应用,构造方法和抽象方法。
package enum_test;
public class Enum {
public static void main(String[] args) {
WeekDay day = WeekDay.MON;
System.out.println(day.nextDay());
}
public enum Demo {
// 元素列表必须位于所有的成分之前。每个元素都是一个类。
SUN, MON, TUE, WED, THI, FRI, SAT;
// 对于枚举的构造方法只能是私有的。
// 元素列表中没有写任何参数时候,默认调用无参构造。
// 如果想调用带参构造,需要加入参数。例:SUN(1);
private Demo() {
}
private Demo(int day) {
}
}
public enum TrafficLamp{
// new子类的实例对象,调用父类的有参构造方法。
RED(30){
@Override
public TrafficLamp nextLamp() {
return GREEN;
}
},
GREEN(40){
@Override
public TrafficLamp nextLamp() {
return YELLOW;
}
},
YELLOW(5){
@Override
public TrafficLamp nextLamp() {
return RED;
}
};
// 定义一个抽象方法。方法的返回类型可以是类本身。
public abstract TrafficLamp nextLamp();
private int time ;
private TrafficLamp(int time){
this.time = time;
}
}
// 枚举只有一个成员时候,就可以作为一种单例的实现方式。
}