Java高新技术 枚举
知识概要:
(1)为什么要有枚举
(2)枚举的示例
(3)枚举的应用
(4)枚举的高级应用
(1)为什么需要枚举
问题:要定义星期几或性别的变量,该怎么定义?
假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;
或即使使用常量方式也无法阻止意外。
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,
编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,
普通变量的方式在开发阶段,无法实现这一目标。
用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能?
私有的构造方法
每个元素分别用一个公有的静态成员变量表示
可以有若干公有方法或抽象方法。
采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
package cn.itheima.day1;public abstract class WeekDay1 {private WeekDay1(){};public static final WeekDay1 MON = new WeekDay1(){public WeekDay1 nextDay(){return SUN;}};public static final WeekDay1 SUN = new WeekDay1(){public WeekDay1 nextDay(){return MON;}};public abstract WeekDay1 nextDay();/*public WeekDay nextDay(){if(this==SUN)return MON;elsereturn SUN;}*/public String toString(){return this==SUN?"SUN":"MON";}
}
代码测试:
package com.itheima.day01; public class WeekDayTest { public static void main(String[] args) { WeekDay Mon = WeekDay.MON; System.out.println(Mon); } }
public enum WeekDay{SUN,MON,TUE,WED,THU,FRI,SAT;//; 可加可不加上private WeekDay(){System.out.println("first");};private WeekDay(int day){System.out.println("second");}}
枚举应用交通灯,trafficLamp 私有的构造函数 私有的成员变量 和public方法
public enum TrafficLamp{RED(50){public TrafficLamp TrafficLampnexLamp(){return GREEN;}},GREEN(30){public TrafficLamp TrafficLampnexLamp(){return YELLOW;}},YELLOW(5){public TrafficLamp TrafficLampnexLamp(){return RED;}};public abstract TrafficLamp TrafficLampnexLamp();private int time;private TrafficLamp(int time){this.time = time;}}}
枚举类总结:
1、枚举类是一种特殊形式的Java类。 枚举元素也是类对象
2、枚举类中声明的每一个枚举值代表枚举类的一个实例对象。
3、枚举类与Java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数。但枚举类的构造函数 必须为私有的(这点不难理解)。
4、枚举类也可以实现接口、或继承抽象类。
5、JDK 1.5 中扩展了switch语句,它除了可以接收int, byte, char, short,String外,还可以接收一个枚举类型。
6、若枚举类只有一个枚举值,则可以当作单例设计模式使用。
7、枚举类的实例变量是把所以的枚举实例都加载一次的。如果调用了某个枚举类,那么该枚举类先把枚举类 里面的所有元素都先加载一次。