枚举
为什么要有枚举?
例:要定义星期几或者性别的变量,该怎么定义?假设用1-7分别表示星期一到星期天,但是还是会有人写成int weekday = 0;
所以,枚举就是要某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值。普通变量方式在开发阶段无法实现这一目标。
枚举:
枚举是一种特殊的类,其中每个元素都是该类一个实例对象。
定义枚举:
使用普通类来定义枚举:
代码示例:人的性别有男和女,所以使用枚举类来实现。先使用普通的java类模拟
public class Gender {
//性别固定为男和女
//枚举类不能直接new对象
private Gender(){}
//通过枚举类名.的方式获取枚举的实例对象
public final static Gender MAN = new Gender();
public final static Gender WOMEN = new Gender();
//枚举需要覆盖自己的toString方法
public String toString() {
return this==MAN?"MAN":"WOMEN";
}
}
使用枚举类定义枚举:
java给我们提供了枚举类,关键字enum
格式:enum 枚举类名
public enum Gender {
//枚举的每一个元素都是其实例对象,必须写在第一行
//元素对象后的;可写可不写
//枚举自己定义好了toString方法
MAN,WOMEN
}
在程序中调用枚举:
代码示例:
Gender man = Gender.MAN;
System.out.println(man);
System.out.println(man.name());//获取枚举的名字
System.out.println(man.ordinal());//获取该枚举类型在枚举类中的脚标
System.out.println(Gender.valueOf("WOMEN"));//枚举类提供的valueOf方法
实现带有构造参数的枚举:
· 与一般的java类定义构造函数的方法基本一致。但是在调用不同参数的构造方法的时候,是由枚举类的每个示例调用的。
代码示例:
public enum EnumDemo {
//调用有参数的构造方法就是在实例对象上直接调用的
A(3), B, C;
//必须写在实例对象的后面
private EnumDemo(){System.out.println("没有参数的构造方法");}
private EnumDemo(int x){System.out.println("有参数的构造方法"+x);};
}
实现带有抽象方法的枚举:
· 有些方法在方法中直接定义,可能并不好写,这时候就需要抽象方法,让子类对实现方法内容
· 例:一个星期中有七天,这七天的值需要固定,所以可以使用枚举。其中有nextDay的方法,如果直接定义在类中,需要做大量的else if判断,所以可以写成抽象的。再用匿名内部类的方法,让子类实现方法
代码示例:
public enum WeekDay {
//在实例中使用匿名内部类的方法覆盖父类的方法
SUN {
public WeekDay nextDay() {
return MON;
}
}, MON {
public WeekDay nextDay() {
return TUE;
}
}, TUE {
public WeekDay nextDay() {
return WED;
}
}, WED {
public WeekDay nextDay() {
return THU;
}
}, THU {
public WeekDay nextDay() {
return FRI;
}
}, FRI {
public WeekDay nextDay() {
return SAT;
}
},SAT {
public WeekDay nextDay() {
return SUN;
}
};
//定义一个抽象的方法
public abstract WeekDay nextDay();
}
练习:
· 写一个红绿灯的程序,并且要求红绿灯在初始化时需要传递一个time值,并在调用时打印这个time。并且在交通灯这个方法中还有nextLight的方法
代码:
public class TrafficLightDemo {
/*
* 交通灯只有红、黄、绿三种颜色,
* 所以可以使用枚举类
*
* nextLight方法可以使用抽象方法
*/
enum TrafficLight {
RED {
public TrafficLight nextLight() {
return GREEN;
}
}, YELLOW {
public TrafficLight nextLight() {
return RED;
}
}, GREEN {
public TrafficLight nextLight() {
return YELLOW;
}
};
public abstract TrafficLight nextLight();
}
public static void main(String[] args) {
TrafficLight red = TrafficLight.RED;
System.out.println(red.nextLight());
}
}