------- android培训、java培训、期待与您交流! ----------
1.枚举相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象法。
枚举是通过enum关键字定义枚举类,枚举类是一个特殊的类,每个元素都是该类的一个实例对象。
枚举元素必须位于枚举体的最开始部分,其后要有分号与其隔开,如果将枚举中的成员方法或成员变量等放在枚举元素的前面,编译器报错。
枚举只有一个成员时,就可以作为一种单例的实现方式。
2.为什么要有枚举
问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
例如:
私有的构造方法
每个元素分别用一个公有的静态成员变量表示
可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
<span style="font-size:18px;">public abstract class WeekDay1 {
private WeekDay1(){}
public final static WeekDay1 SUN = new WeekDay1(){
public WeekDay1 nextDay() {
return MON;
}
};
public final static WeekDay1 MON = new WeekDay1(){
public WeekDay1 nextDay() {
return SUN;
}
};
public abstract WeekDay1 nextDay();
public String toString(){
return this==SUN?"SUN":"MON";
}
}
</span>
3枚举方法
构造方法:枚举的构造方法必须定义为私有的。
如果有多个构造方法,通过传入的不同类型的参数调用构造方法。
枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
非静态方法:String toString() ; 获取枚举的名称
String name(); 获取此枚举常量的名称
Class getClass() ; 获取对应的类名
int ordinal() ; 获取枚举值在枚举类中的顺序
静态方法:valueOf(String e) ;转为对应的枚举对象
values() ; 获取所有的枚举对象元素
<span style="font-size:18px;">public class EnumDemo {
public static void main(String[] args) {
WeekDay weekDay=WeekDay.MON;
System.out.println(weekDay);
System.out.println(weekDay.name()); //获取对象名
System.out.println(weekDay.getClass()); //获取对应类
System.out.println(weekDay.toString()); //获取枚举对象名
System.out.println(weekDay.ordinal()); //获取此对象在枚举常量的次序
System.out.println(WeekDay.valueOf("WED")); //将字符串转化为枚举常量
System.out.println(WeekDay.values().length); //获取所以的枚举元素,并打印其长度 。length是一个属性
}
//定义枚举内部类
public enum WeekDay{
SUN(1),MON(),TUE,WED,THI,FRI,SAT;
//无参构造器
private WeekDay(){
System.out.println("First");
}
//带参数的构造器
private WeekDay(int day){
System.out.println("Second");
}
}
}
</span>
4.实现带有抽象方法的枚举
枚举中的常量需要子类来实现,这是可以利用内部类的方式来定义枚举常量
<span style="font-size:18px;">public class EnumTest {
public enum TrafficLamp{
RED(25){
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(30){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
return RED;
}
};
private int time;
//构造器
private TrafficLamp(int time){
this.time=time;}
//抽象方法
public abstract TrafficLamp nextLamp();
}
} </span>