黑马程序员-------(高新技术)枚举

来源:互联网 发布:免费的网络摄像头社区 编辑:程序博客网 时间:2024/06/05 07:51

-------------java培训android培训、java博客、java学习型技术博客、期待与您交流! --------------

枚举

为什么要有枚举
问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。 
私有的构造方法
每个元素分别用一个公有的静态成员变量表示
可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
枚举的基本应用
举例:定义一个Weekday的枚举。
扩展:枚举类的values,valueOf,name,toString,ordinal等方法(记住,讲课时要先于自定义方法前介绍,讲课更流畅)
总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。

枚举的高级应用
枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
带构造方法的枚举
构造方法必须定义成私有的
如果有多个构造方法,该如何选择哪个构造方法?
枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
带方法的枚举
定义枚举TrafficLamp
实现普通的next方法
实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。
增加上表示时间的构造方法
枚举只有一个成员时,就可以作为一种单例的实现方式。

 

package cn.itcast.day1;public class EnumText {public static void main(String[] args) {WeekDay1 weekday =WeekDay1.MON;System.out.println(weekday.nextDay());System.out.println("------------------");WeekDay weekDay2 = WeekDay.FRI;System.out.println("----s--");System.out.println(weekDay2);System.out.println("-----ss---------");System.out.println(weekDay2.name());System.out.println(weekDay2.ordinal());System.out.println(weekDay2.getClass());System.out.println("----");//该方法类似Integer.valueOf(3);,将一个变成另一个类型的System.out.println(WeekDay.valueOf("SAT").toString());System.out.println("--");System.out.println(WeekDay.values());WeekDay[] weekDay3 = WeekDay.values();for(WeekDay weekDay:weekDay3){System.out.print(weekDay);}System.out.println();System.out.println("——————————————————————————————————————————");TrafficLamp tl =TrafficLamp.RED;System.out.println(tl.nextLamp());}//内部类public enum WeekDay{//下面SUN~SAT都是枚举元素,是静态变量,只有用到类,所以的静态构造方法就会执行SUN(8),MON,TUE,WED(3),THI(),FRI,SAT;/*//调用第2个构造方法SUN(8),//默认调用第1个构造方法MON,TUE,WED(3),//指定调用第1个构造方法THI(),FRI,SAT;*/private WeekDay(){System.out.println("1111111111111");}private WeekDay(int day ){System.out.println("2222222222222");}}//内部类(有四个修饰)public enum TrafficLamp{//创建构造方法,为红灯的情况提高等待时间time//其实【【RED(30) {}】】这就是TrafficLamp的子类,并且调用父类为TrafficLamp的有参构造方法RED(30) {@Overridepublic TrafficLamp nextLamp() {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;}}}


 

package cn.itcast.day1;public abstract class WeekDay1 {private WeekDay1(){}public final static WeekDay1 SUN = new WeekDay1(){public WeekDay1 nextDay() {// TODO Auto-generated method stubreturn MON;}}; public final static WeekDay1 MON = new WeekDay1(){public WeekDay1 nextDay() {// TODO Auto-generated method stubreturn SUN;}}; /*public WeekDay nextDay(){if(this==SUN)return MON;else return SUN;}*///定义抽象方法public abstract WeekDay1 nextDay();public String toString(){return this==SUN?"SUN":"MON";}}



-------------java培训android培训、java博客、java学习型技术博客、期待与您交流! --------------

原创粉丝点击