【黑马程序员】Java基础加强14:JDK1.5枚举
2014-01-06 18:26
441 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
一、JDK1.5的枚举
枚举的作用:
1、枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器就报错;
2、枚举可以让编译器在编译时就控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标,这也是JDK1.5的新特性。
用普通类模拟枚举:如定义Weekday的类。
1、私有化构造方法;
2、每个元素分别用一个公有的静态成员变量表示;
3、可以有若干公有方法或抽象方法,采用抽象方法定义nextDay就将大量的if...else语句转移成了一个个独立的类。
代码示例如下:
二、枚举应用与实例
枚举的应用:
1、枚举关键字:enum,定义枚举时,将类中的class换成enum;
2、枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法;
3、枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔;若把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误;
4、枚举中的构造方法必须使用private作访问修饰符(类似单例模式一般);
5、在枚举常量后加括号(参数),调用的是相应的有参的构造函数;若无括号或括号内无参数,则调用无参的构造函数;
代码示例:定义一个Weekday的枚举,内部定义有参和无参的构造函数。
6、枚举类型中有抽象方法的时候,在定义枚举成员时,必须同时要求枚举成员实现这个枚举类型的抽象方法,否则编译报错;
7、若枚举内部含有抽象方法,不需在其上加上abstract关键字,而一般情况下,含有抽象方法的类是抽象类。
代码示例:定义一个交通灯的枚举类,内部实现抽象方法
8、枚举与单例
若枚举中只有一个成员时,就可以作为一种单例的实现方式,如下所示:
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
一、JDK1.5的枚举
枚举的作用:
1、枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器就报错;
2、枚举可以让编译器在编译时就控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标,这也是JDK1.5的新特性。
用普通类模拟枚举:如定义Weekday的类。
1、私有化构造方法;
2、每个元素分别用一个公有的静态成员变量表示;
3、可以有若干公有方法或抽象方法,采用抽象方法定义nextDay就将大量的if...else语句转移成了一个个独立的类。
代码示例如下:
package blog.itheima; public abstract class WeekDay1 { //私有化构造函数 private WeekDay1(){} //每个元素分别用一个公有的静态成员变量表示 //采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。 public final static WeekDay1 SUN = new WeekDay1(){ public WeekDay1 nextDay() { return MON; } }; public final static WeekDay1 MON = new WeekDay1(){ public WeekDay1 nextDay() { return SUN; } }; //拥有一个抽象方法 public abstract WeekDay1 nextDay(); /* 如果不是抽象方法,将会有大量的if.else语句 public WeekDay nextDay(){ if(this == SUN){ return MON; }else{ return SUN; } }*/ //复写toString()方法,打印字符串 public String toString(){ return this==SUN?"SUN":"MON"; } }
二、枚举应用与实例
枚举的应用:
1、枚举关键字:enum,定义枚举时,将类中的class换成enum;
2、枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法;
3、枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔;若把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误;
4、枚举中的构造方法必须使用private作访问修饰符(类似单例模式一般);
5、在枚举常量后加括号(参数),调用的是相应的有参的构造函数;若无括号或括号内无参数,则调用无参的构造函数;
代码示例:定义一个Weekday的枚举,内部定义有参和无参的构造函数。
package blog.itheima; public class EnumTest { public static void main(String[] args) { WeekDay weekDay2 = WeekDay.FRI; //初如化函数,会调用1次SUN的有参方法,6次无参方法 System.out.println(weekDay2.name()); System.out.println(weekDay2.ordinal());//枚举元素的序列 System.out.println(WeekDay.valueOf("SUN").toString()); System.out.println(WeekDay.values().length); } //定义枚举的 public enum WeekDay{ SUN(1),MON(),TUE,WED,THI,FRI,SAT; //这是枚举无参数的构造方法 private WeekDay(){System.out.println("first");} //枚举中有参数的构造方法 private WeekDay(int day){System.out.println("second");} /*总结:枚举是一种特殊的类,其 a109 中的每个元素都是该类的一个实例对象, 例如可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName()*/ } }
6、枚举类型中有抽象方法的时候,在定义枚举成员时,必须同时要求枚举成员实现这个枚举类型的抽象方法,否则编译报错;
7、若枚举内部含有抽象方法,不需在其上加上abstract关键字,而一般情况下,含有抽象方法的类是抽象类。
代码示例:定义一个交通灯的枚举类,内部实现抽象方法
package blog.itheima; public class EnumTest { public static void main(String[] args) { System.out.println(TrafficLamp.GREEN); System.out.println(TrafficLamp.GREEN.nextLamp()); } //定义枚举的 public enum WeekDay{ SUN(1),MON(),TUE,WED,THI,FRI,SAT; //这是枚举无参数的构造方法 private WeekDay(){System.out.println("first");} //枚举中有参数的构造方法 private WeekDay(int day){System.out.println("second");} /*总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象, 例如可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName()*/ } public enum TrafficLamp{ RED(30){ public TrafficLamp nextLamp(){ return GREEN; } }, GREEN(45){ public TrafficLamp nextLamp(){ return YELLOW; } }, YELLOW(5){ public TrafficLamp nextLamp(){ return RED; } }; public abstract TrafficLamp nextLamp(); private int time; //定义交通灯的亮灯时间 private TrafficLamp(int time){ this.time = time; } //由代码可看出枚举中元素实现抽象方法,其实就是调用匿名内部类。 } }
8、枚举与单例
若枚举中只有一个成员时,就可以作为一种单例的实现方式,如下所示:
//单例饿汗式 class Single{ private static Single instance = new Single(); private Single(){} public static Single getInstance(){ return instance; } } //单例枚举 public enum Singleton { INSTANCE{ public void someMethod() { //执行语句 } }; public abstract void someMethod(); }
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
相关文章推荐
- 黑马程序员--Java基础加强--14.利用反射操作泛型III【解析关于泛型类型的细节信息的获取方法】【Method与泛型相关的方法】【个人总结】
- 黑马程序员_Java基础加强_内省
- 黑马程序员_Java基础加强_反射
- 黑马程序员-Java基础加强,枚举类入门
- 【黑马程序员】java基础加强_JavaBean
- 黑马程序员 21 Java基础加强-03-内省篇
- 黑马程序员----【java基础加强】张孝祥视频总结2
- 黑马程序员--Java基础加强--04.代码简化 书写规律III_数组参数【重载】【数组】【可变参数数组】【泛型可变参数数组】【个人总结】
- 黑马程序员-Java基础加强之泛型
- 黑马程序员-----java基础加强<一>
- 黑马程序员-java基础加强-JDK1.5新特性
- 黑马程序员_Java基础加强3
- 黑马程序员-Java基础加强(3)
- 黑马程序员_java编程基础14 String
- 黑马程序员_Java基础加强_枚举
- 黑马程序员-java基础加强_myeclipse
- 黑马程序员--Java基础加强--08.【javac兼容编译原则】【可变参数数组编译】【个人总结】
- 黑马程序员_java基础加强学习笔记之注解
- 黑马程序员_日记04(java基础加强01)
- 黑马程序员-java基础加强(一)