一、枚举的作用介绍(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()方法。