A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 文盲庄稼汉 中级黑马   /  2014-8-30 11:34  /  815 人查看  /  0 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

枚举
一、枚举的作用介绍
1、为什么要有枚举
问题:要定义星期几或性别的变量,该怎么定义?
假设用1-7分别表示星期一到星期日,但有人可能会写成 int weekday = 0;
有的用0~6表示,当一个项目有很多人同时在开发时,为了同一,于是枚举就用上了,
枚举就是要让每个类型的变量的取值只能为若干个固定值中的一个,否则编译器就会报错。
枚举可以让编译器在编译的时候就可以控制源程序中填写的非法值,普通变量的方式
在开发阶段无法实现这一目标。
2、用普通类如和实现枚举功能?
定义一个Weekday的类来模拟枚举功能。
1)私有的构造非法
2)每个元素分别用一个公有的静态成员变量表示
3)可以有若干公有方法或抽象方法,例如,要提供nextDay方法必须是抽象的。
3、用普通类模拟枚举的实现原理
定义一个Weekday的类来模拟枚举功能。
私有的构造方法,每个元素分别用一个公有的静态成员变量表示
可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将
大量的if.else语句转移成了一个个独立的类。
二、枚举的基本应用
枚举就相当于一个类,其中也可以定义构造方法,成员变量,普通方法和抽象方法。
枚举元素必须位于枚举体中的最开始部分,枚举元素列表的或面要有分号与其他成员分隔。
如果把枚举中的成员方法或变量等放在枚举元素的前面,编译器报错。
举例:定义一个Weekday的枚举。
扩展:枚举类的value,valueOf,name,toString,ordinal等方法。
总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,
例如可以调用
WeekDay.SUM.getClass().getName()和WeekDay.class.getName()。
实例
  1. class  Demo14{
  2.     public static void main(String[] args) {
  3.         WeekDay weekDay2 =  WeekDay.FRI;
  4.         System.out.println(weekDay2);
  5.         System.out.println(weekDay2.name());
  6.         System.out.println(weekDay2.ordinal());
  7.         System.out.println(WeekDay.valueOf("SUN").toString());
  8.         System.out.println(WeekDay.values().length);
  9.     }
  10.     public enum WeekDay{
  11.         SUN,MON,TUE,WED,THI,FRI,SAT;  //这个分号可写可不写
  12.     }
  13. }
复制代码

三、实现带有构造方法的枚举
构造方法必须定义成私有的
如果有多个构造方法,该如何选择哪个构造方法?
枚举元素MON和MON()的效果一样,都是调用默认的构造方法。

实例
  1. class Demo15 {
  2. public static void main(String[] args) {
  3. WeekDay today = WeekDay.SAT;
  4. System.out.println(today+"的下一天是"+today.nextDay());
  5. }
  6. }
  7. class WeekDay {
  8.     //构造函数
  9. private WeekDay(){}

  10. //创建星期的七个对象
  11. public final static WeekDay SUN = new WeekDay();
  12. public final static WeekDay MON = new WeekDay();
  13. public final static WeekDay TUE = new WeekDay();
  14. public final static WeekDay WED = new WeekDay();
  15. public final static WeekDay THU = new WeekDay();
  16. public final static WeekDay FN  = new WeekDay();
  17. public final static WeekDay SAT = new WeekDay();
  18.    
  19.     //下一天的方法
  20. public WeekDay nextDay() {                              
  21. if(this==SUN)
  22.             return MON;
  23.         else if(this==MON)
  24.             return TUE;
  25.         else if(this==TUE)
  26.             return WED;
  27.         else if(this==WED)
  28.             return THU;
  29.         else if(this==THU)
  30.             return FN;
  31.         else if(this==FN)
  32.             return SAT;
  33.         else
  34.             return SUN;
  35. }

  36.     //重写toString()方法
  37. public String toString(){                             
  38. if (this == SUN)
  39.             return "星期日";
  40.         else if(this==MON)
  41.             return "星期一";
  42.         else if(this==TUE)
  43.             return "星期二";
  44.         else if(this==WED)
  45.             return "星期三";
  46.         else if(this==THU)
  47.             return "星期四";
  48.         else if(this==FN)
  49.             return "星期五";
  50.         else
  51.             return "星期六";
  52. }
  53. }
复制代码


四、实现带有抽象方法的枚举
1、定义枚举TrafficLamp
2、实现普通的next方法
3、实现抽象的next方法:
    每个元素分别是由枚举类的子类来生产的实例对象,
    这些子类采用类似内部类的方式进行定义。
4、增加上表示时间的构造方法
如果枚举元素后面没有大括号对,那是不会生产内部类的。
先看有内部类的效果,再看没有内部类的效果,eclipse自动删除原来的内部类。
枚举只有一个成员时,就可以作为一种单例的实现方式。
实例
  1. class Demo16{
  2. public static void main(String[] args){
  3. WeekDay today = WeekDay.SAT;
  4. System.out.println("SAT的下一天为"+today.nextDay());
  5. }

  6. //创建枚举
  7. public enum WeekDay {
  8. SUN {
  9. public WeekDay nextDay()
  10. return MON;
  11. },
  12. MON {
  13. public WeekDay nextDay()
  14. return TUE;
  15. },
  16. TUE {
  17. public WeekDay nextDay()
  18. return WED;
  19. },
  20. WED {
  21. public WeekDay nextDay()
  22. return THU;
  23. },
  24. THU {
  25. public WeekDay nextDay()
  26. return FN;
  27. },
  28. FN {
  29. public WeekDay nextDay()
  30. return SAT;
  31. },
  32. SAT {
  33. public WeekDay nextDay()
  34. return SUN;
  35. };

  36. public abstract WeekDay nextDay();//创建抽象方法nextDay(),返回的对象是类的本身WeekDay。
  37. }
  38. }
复制代码

个人的一个小总结希望可以对大家有帮助。



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马