一、枚举的作用介绍(enum)
作用:要让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
二、用普通类模拟枚举的实现原理
步骤:
(1) 私有的构造函数;
(2) 每个元素分别用一个共有的静态成员变量表示;
(3) 可以有若干方法或者抽象方法,将抽象方法转移成独立的类。
package cn.itcast; public class Java_15 { public static void main(String[] args) { Weekday weekday = Weekday.THU; } public enum Weekday { SUN(), MON(1), TUE, WED, THU, FIR, SAT; /*在枚举后边跟上(),指向参数列表,就表示创建这个实例对象的时候指向对应构造方法*/ private Weekday() { System.out.println("first"); } private Weekday(int day) { System.out.println("second"); } } }
总结:
(1) 枚举实例化过程分析,当用到枚举类,里面的里面的静态变量都会初始化,此时调用对应的构造方法,如:MON(1),调用带参数的构造方法,即private Weekday(int day) {}。
SUN()与TUE调用无参的构造方法,即private Weekday() {}
(2) 如何保证唯一性,如:Weekdayweekday = Weekday.THU; THU这个常量是WeekDay类型的对象,所以可以把它赋给WeekDay引用类型的变量 weekDay,如果想为这个引用变量赋值,只能赋WeekDay类中规定好的。
三、枚举的基本应用
package cn.itcast; public abstract class EnumTest1 { public static void main(String[] args) { WeekDay weekday = WeekDay.FRI; //枚举就相当于一个类 System.out.println(weekday.name()); System.out.println(weekday.ordinal());//得到自己的排行 System.out.println(WeekDay.valueOf("SUN"));//把字符转转换成枚举对象 System.out.println(WeekDay.values().length);//将枚举中的对象转换成数组并求长度 } //创建枚举 public enum WeekDay { SUN, MON, TUE, WED, THU, FRI, SAT; } }
四、实现带有参数的构造方法
只要用到了枚举类,里面的里面的静态变量都会初始化,此时调动构造方法;
在枚举后边跟上(),指向参数列表,就表示创建这个实例对象的时候指向对应构造方法
package cn.itcast; public class Java_15 { public static void main(String[] args) { Weekday weekday = Weekday.THU; } public enum Weekday { SUN(), MON(1), TUE, WED, THU, FIR, SAT; /*在枚举后边跟上(),指向参数列表,就表示创建这个实例对象的时候指向对应构造方法*/ private Weekday() { System.out.println("first"); } private Weekday(int day) { System.out.println("second"); } } }
综合实例:
实现带有抽象方法的枚举
内部类在成员位置上可以有四种修饰符
加上abstract之后RED只能是TrafficLamp子类的,就要实现其抽象方法。
package cn.itcast; public class Java_16_02 { public static void main(String[] args) { TrafficLamp red = TrafficLamp.RED; red.nextLamp(); } } enum TrafficLamp { RED(30) { @Override public TrafficLamp nextLamp() { return GREEN; } }, GREEN(45) { @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; } }
分析:枚举TrafficLamp中定义了RED、GREEN、YELLOW,因为声明了抽象的方法nextLamp(),所以RED、GREEN、YELLOW只能由TrafficLamp的子类去实现,在RED(),内定义内部类实现nextLamp()方法。