1,枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个。否则,编译器会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法制,普通变量的方式在开发阶段是不能实现这个目标的。
2,枚举是一种特殊的类,其中的每一个元素都是一个对象。
3,可以用枚举实现单例。(因为单例就是只用一个对象。当枚举就一个元素的时候,就是单例模式。)
4,枚举的构造方法是私有的 ,private
1,用普通的类实现枚举的功能:
package com.test;
public abstract class WeekDay {
//构造方法私有的,不可以new 实例。
private WeekDay(){};
//new出几个对象共外界使用。
public static final WeekDay SUN = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return MON;
}
};
public static final WeekDay MON = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return SUN;
}
};
public abstract WeekDay nextDay();
//普通的方法来实现,可以使用匿名内部类,如上。
@Override
public String toString() {
return this==MON ?"mon":"sun";
}
}
这样我们在别的地方要使用上面类的成员的时候,就只能取固定的几个值。
WeekDay SUN = WeekDay.SUN;
WeekDay MON = WeekDay.MON;
System.out.println(SUN.nextDay());
下面我们使用枚举来实现,就简单的多了》
public enum WeekDay1 {
SUN,MON(2);
private WeekDay1(){};//不带参数的构造方法
private WeekDay1(int i){};//带参数的构造方法。和Java的普通类很像,但写法不一样。
}
WeekDay1 mon = WeekDay1.MON;
System.out.println(mon.name());
System.out.println(mon.ordinal());/返回序号。
System.out.println(mon.values());
System.out.println(mon.valueOf("SUN"));//SUN
System.out.println(WeekDay1.values());//返回数组
System.out.println(WeekDay1.valueOf("SUN"));//返回SUN
下面写一个比较复杂的枚举例子,带抽象方法,和参数的构造方法。
public enum TrafficLamp{
GREEN(20){
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return YELLOW;
}
},RED(15){
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return GREEN;
}
},YELLOW(5){
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){this.time = time;}
}