目录 :
1 ) . 枚举的作用介绍
2 ) . 用普通类模拟枚举的实现原理
3 ) . java5的枚举的基本应用
4 ) . 实现带有构造方法的枚举
5 ) . 实现带有抽象方法的枚举
一
. 枚举的作用介绍
1 ) . 为什么要有枚举?
1.1 问题 : 若要定义星期几或者性别的变量,该怎么定义? 假设用1~7分别表示星期一到星期日,有人也许会写成int weekday ={...} 的方式,但当我们调用时不用{}中自定义的也可以
1.2 枚举来干哈? : 枚举就是让某个类型的变量的取值只能为以上{}中若干个固定值中的一个,否则编译器就会报错
[1] 优势 : 枚举可以在编译器编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标
小结 :
1. 枚举就是限定了一堆 不可变的数据, 而且在特定的情况下选择时 只能选择 这堆数据 ,不选择 则 编译器报错 ,也可以说枚举在这充当 控制防止数据非法的作用
二. 用普通类模拟枚举的实现原理
1 ) . 案例 : 定义一个weekDay的类,来实现枚举功能 , 以下是通过普通类模拟的枚举类
1.1 main :
package cn.ittext.day01;public class EnumerationTest{public static void main(String[] args ){WeekDay mon = WeekDay. MON ; //获取星期中的星期一WeekDay turs = mon .nextDay(); //星期一对象获取下一天是星期几System. out .println( mon );System. out .println( turs );}}
1.2 第一种方式 : if判断的方式实现自定义星期
package cn.ittext.day01;public class WeekDay{private WeekDay() {} ; //构造函数私有public final static WeekDay MON = new WeekDay(); //实例化静态最终的周一对象public final static WeekDay TUES = new WeekDay(); //实例化静态最终的周二对象public final static WeekDay WEDNES = new WeekDay(); //实例化静态最终的周三对象public final static WeekDay THURS = new WeekDay(); //实例化静态最终的周四对象public final static WeekDay FRI = new WeekDay(); //实例化静态最终的周五对象public final static WeekDay SATUR = new WeekDay(); //实例化静态最终的周六对象public final static WeekDay SUN = new WeekDay(); //实例化静态最终的周日对象public WeekDay nextDay() //下一天的方法{if ( this == MON )return TUES ;if ( this == TUES )return WEDNES ;if ( this == WEDNES )return THURS ;if ( this == THURS )return FRI ;if ( this == FRI )return SATUR ;if ( this == SATUR )return SUN ;if ( this == SUN )return MON ;return null ;}public String toString() //打印方法{if ( this == MON )return "MON" ;if ( this == TUES )return "TUES" ;if ( this == WEDNES )return "WEDNES" ;if ( this == THURS )return "THURS" ;if ( this == FRI )return "FRI" ;if ( this == SATUR )return "SATUR" ;if ( this == SUN )return "SUN" ;return null ;}}
1.3 第二种方式 : 内部类的方式实现自定义星期
package cn.ittext.day01;/**通过代码可看出通过内部类的方式实现了一周期的运用 : 一个类中固定的常用不变的对象,一个对象固定的方法*须知 : 当想要获取内部类时,在new 的对象加上{} 即可*/public abstract class WeekDay1{private WeekDay1() {} ; //构造函数私有public final static WeekDay1 MON = new WeekDay1() //通过内部类的方式实现本类中自定义的抽象方法{@Overridepublic WeekDay1 nextDay() {// TODO Auto-generated method stubreturn TUES ;}}; //实例化静态最终的周一对象public final static WeekDay1 TUES = new WeekDay1() {@Overridepublic WeekDay1 nextDay() {// TODO Auto-generated method stubreturn WEDNES ;}}; //实例化静态最终的周二对象public final static WeekDay1 WEDNES = new WeekDay1() {@Overridepublic WeekDay1 nextDay() {// TODO Auto-generated method stubreturn THURS ;}}; //实例化静态最终的周三对象public final static WeekDay1 THURS = new WeekDay1(){@Overridepublic WeekDay1 nextDay() {// TODO Auto-generated method stubreturn FRI ;}}; //实例化静态最终的周四对象public final static WeekDay1 FRI = new WeekDay1(){@Overridepublic WeekDay1 nextDay() {// TODO Auto-generated method stubreturn SATUR ;}}; //实例化静态最终的周五对象public final static WeekDay1 SATUR = new WeekDay1(){@Overridepublic WeekDay1 nextDay() {// TODO Auto-generated method stubreturn SUN ;}}; //实例化静态最终的周六对象public final static WeekDay1 SUN = new WeekDay1(){@Overridepublic WeekDay1 nextDay() {// TODO Auto-generated method stubreturn MON ;}}; //实例化静态最终的周日对象public abstract WeekDay1 nextDay(); //抽象方法,让内部类继承用的}
2 ) . 关于自定义枚举的注意事项
2.1 私有的构造方法
2.2 每个元素分别用一个公有的静态成员变量表示,每个元素就是一个对象
2.3 可以有若干公有方法或抽象方法,例如 : 要提供nextDay方法时必须是抽象的
小结 :
1. 每一个枚举元素都是一个对象
三.
java5的枚举的基本应用
1 ) . Demo:
package cn.ittext.day01;public class EnumerationTest2{public static void sop(Object obj ){System. out .println( obj );}public static void main(String[] args ){WeekDay turs = WeekDay. TURS ; //获取MON对象sop ( turs ); //获取该对象的toString方法的值sop ( "ordinal:" + turs .ordinal()); //获取其对象的坐标值sop ( "name:" + turs .name()); //获取其对象值//-----------------------------------------------sop ( "valueOf:" +WeekDay. valueOf ( "MON" )); //获取其字符串"MON"在枚举方法中对应的对象sop ( "values:" +WeekDay. values (). length ); //获取其枚举方法中的所有枚举对象的个数}public enum WeekDay{ MON , TURS , WEDNES , THURS , FRI , SATUR , SUN ;}}
2 ) . 必知 :
2.1 每一个枚举元素都是一个对象
3.2 每一个枚举对象的内部都自动实现了toString()方法
3.3 我们可通过"" 字符串的形式 获取其对应的枚举对象
3.4 我们可通过枚举的方式实现 公地
3.枚举定义方式 : public enum 变量名(常量对象名,......);
四. 实现带有构造方法的枚举
1 ) . 须知 :
1.1 构造方法必须定义在元素对象列表之后
1.2 构造方法啊必须私有化
1.3 枚举函数默认使用的是空参的构造方法,若使用其它的构造方法则需在枚举对象后指定即可 ; 例如 : MON(1)
2 ) . Demo:
package cn.ittext.day01;public class EnumerationTest2{public static void sop(Object obj ){System. out .println( obj );}public static void main(String[] args ){WeekDay turs = WeekDay. TURS ; //获取MON对象}public enum WeekDay{//可通过在枚举元素后通过()参数列表指定在初始化时 用哪个构造函数进行实例化MON , TURS (1), WEDNES , THURS , FRI , SATUR , SUN ;private WeekDay(){sop ( "first" );}private WeekDay( int day ){sop ( "second" );}}}
小结 :
1. 我们可通过在枚举元素后加参数列表的方式在初始化时使用相应的构造函数进行实例化
五
. 实现带有抽象方法的枚举
1 ) . Demo: 实现带有抽象方法的枚举
package cn.ittext.day01;public class EnumErationTest3{public static void sop(Object obj ){System. out .println( obj );}public static void main(String[] args ){TrafficLamp green = TrafficLamp. GREEN ; //获取枚举对象中的枚举元素GREENsop ( green .nextLamp()); //输出枚举元素的下一个元素}public enum TrafficLamp{RED (30) //使用有参的构造函数,用来限定时间{@Overridepublic TrafficLamp nextLamp() //从父类( enum 枚举)继承过来的方法{return GREEN ;}},GREEN (45){@Overridepublic TrafficLamp nextLamp(){return YELLOW ;}},YELLOW (5){@Overridepublic TrafficLamp nextLamp() {return RED ;}};//枚举元素与枚举类的关系可以理解为是继承关系,因为在该类中自定义一个抽象方法,则内部的枚举元素也需继承其抽象方法public abstract TrafficLamp nextLamp(); //在本类中自定义一个抽象方法private int time ; //定义一个变量private TrafficLamp( int time ) { this . time = time ;}; //定义一个有参的构造函数}}
2 ) . 小知识 :
2.1 我们也可通过枚举类的方式去实现单例模式,只需枚举类中只有一个枚举元素即可
3 ) . 简述 :
3.1 枚举相当于一个类,其中可定义构造方法,成员,变量,普通方法和抽象方法
3.2 枚举元素必须位于枚举体中的最开始部分,枚举元素之间要用,分割,枚举列表的最后要用 ; 与其他的方法分割开
3.3 带构造方法的枚举实现注意 :
[1] 构造方法必须定义成私有的
[2] 若有多个构造方法,则通过枚举元素()参数列表的方式去选择适合的构造方法
[3] 枚举元素MON与MON()的效果是一样的,都是调用默认的构造方法
3.4 带方法的枚举注意事项
[1] ,枚举类中定义抽象方法,枚举元素必须得实现
[2] 枚举类中定义有参构造函数时,枚举元素() 中必须得传参
[3] 枚举元素与枚举类之间的关系可理解为 继承 ,因此 当枚举类中有抽象方法时,枚举元素需通过 内部类实现其方法
4 ) . 问题 :
4.1 当枚举中的成员变量或成员方法放在枚举元素的前面时,编译器报告错误
小结 :
1. 当枚举中只有一个成员时,也就是单例的一种实现方式
六. 总结:
1 ) . 我们可通过枚举定义那些有限的重复使用的对象以此来节约内存消耗, 也可通过枚举的方式简洁的完成单例模式 , 也可通过枚举方式 完成子继承父,内部类的使用
2 ) . 当出现一个父类的子类是有限的时候,而这些子类又是需要高频使用的时候,我们可想到通过枚举类的方式实现