枚举

来源:互联网 发布:历史大事年表知乎 编辑:程序博客网 时间:2024/06/07 00:40

枚举

为什么要有枚举?

例:要定义星期几或者性别的变量,该怎么定义?假设用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());}}

0 0
原创粉丝点击