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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© —__ 中级黑马   /  2012-5-7 05:02  /  1660 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

张孝祥 讲课方式 个人有点不习惯 枚举问题没听懂 ,请人简单给我在解释一下 另带几个实例应用 感激不仅

3 个回复

倒序浏览
本帖最后由 张小锋 于 2012-5-7 05:28 编辑

枚举其实就是一种类型
就像int,String类...或者自定义的类, 比如Student,Person类.
枚举的定义和使用就像它们.(当你定义一个枚举类时,会生成对应的.class文件,这就是证明)
枚举同常用于语限制取值的范围;
例如定义一个星期类,因为固定是7天,只能限制值是0-6,使用枚举可以避免发生不必要的Exception,也可达到简化代码,明了的目的。
简单的示例:
性别:
public enum SexEnum {
  male, female;
}
颜色:
public enum Color {
  RED, BLUE,GREEN,BLACK;
}
回复 使用道具 举报
本帖最后由 赵玮_Tom 于 2012-5-7 09:20 编辑

其实张老师讲的已经很清楚了。
枚举是jdk1.5的新特性。所谓枚举,就是你自定义的一种数据类型,这种类型只能在某个区间内取值(如交通灯的取值只能为红、绿、黄三种),超出取值区间,编译报错(如果不用枚举类型,错误有可能出现在运行时期)。
1)枚举用关键字enum来标记。
2)枚举的构造方法只能私有。
3)枚举的每个元素其实都是该枚举类的一个实例对象。
4)枚举元素类表要放在枚举类的最前面(构造方法、变量等都有放在枚举元素类表的后面)。
5)枚举可以有带参数的构造方法,如果枚举元素采用带参数的构造方法实例化,要调用该参数。
6)枚举可以有抽象方法,每个元素须覆写该方法。
7)单例模式也可以用只有一个元素的枚举来实现。
举例如下(其实也是张老师的例子WeekDay):
如果用一般的类来实现枚举功能,是这样的:
  1. public abstract class WeekDay1
  2. {
  3. private WeekDay1(){};//私有构造方法

  4. //在类内部创建多个子类实例对象,并覆写类中抽象方法(此处采用的是匿名内部类方式)
  5. public static final WeekDay1 SUN = new WeekDay1()
  6. {
  7. public WeekDay1 nextDay()
  8. {
  9. return MON;
  10. }
  11. };
  12. public static final WeekDay1 MON = new WeekDay1()
  13. {
  14. public WeekDay1 nextDay()
  15. {
  16. return TEU;
  17. }
  18. };
  19. public static final WeekDay1 TEU = new WeekDay1()
  20. {
  21. public WeekDay1 nextDay()
  22. {
  23. return WED;
  24. }
  25. };
  26. public static final WeekDay1 WED = new WeekDay1()
  27. {
  28. public WeekDay1 nextDay()
  29. {
  30. return THU;
  31. }
  32. };
  33. public static final WeekDay1 THU = new WeekDay1()
  34. {
  35. public WeekDay1 nextDay()
  36. {
  37. return FRI;
  38. }
  39. };
  40. public static final WeekDay1 FRI = new WeekDay1()
  41. {
  42. public WeekDay1 nextDay()
  43. {
  44. return SAT;
  45. }
  46. };
  47. public static final WeekDay1 SAT = new WeekDay1()
  48. {
  49. public WeekDay1 nextDay()
  50. {
  51. return SUN;
  52. }
  53. };

  54. public abstract WeekDay1 nextDay();

  55. //toString方法
  56. public String toString()
  57. {
  58. if(this==SUN)
  59. return "SUN";
  60. else if(this==MON)
  61. return "MON";
  62. else if(this==TEU)
  63. return "TEU";
  64. else if(this==WED)
  65. return "WED";
  66. else if(this==THU)
  67. return "THU";
  68. else if(this==FRI)
  69. return "FRI";
  70. else
  71. return "SAT";
  72. }
  73. }
复制代码
实现统一的功能,枚举的实现方式是:
  1. public enum WeekDay
  2. {
  3. //枚举中元素列表必须位于所有内容之前,并覆写抽象方法
  4. SUN(0)
  5. {
  6. public WeekDay nextDay()
  7. {
  8. return MON;
  9. }
  10. },
  11. MON(1)
  12. {
  13. public WeekDay nextDay()
  14. {
  15. return TEU;
  16. }
  17. },
  18. TEU(2)
  19. {
  20. public WeekDay nextDay()
  21. {
  22. return WED;
  23. }
  24. },
  25. WED(3)
  26. {
  27. public WeekDay nextDay()
  28. {
  29. return THU;
  30. }
  31. },
  32. THU(4)
  33. {
  34. public WeekDay nextDay()
  35. {
  36. return FRI;
  37. }
  38. },
  39. FRI(5)
  40. {
  41. public WeekDay nextDay()
  42. {
  43. return SAT;
  44. }
  45. },
  46. SAT(6)
  47. {
  48. public WeekDay nextDay()
  49. {
  50. return SUN;
  51. }
  52. };

  53. private int day;
  54. //私有构造方法
  55. private WeekDay(int day)
  56. {
  57. this.day = day;
  58. };
  59. //定义抽象方法
  60. public abstract WeekDay nextDay();
  61. }

复制代码
值得一提的是:API中提供了对枚举的支持,可以在API中查找到用于直接操作枚举的方法(如ordinal(), valueOf()等)。这样的话,采用枚举类比一般类的方式要更加简便,安全性更高。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
用最简单的代码说明问题:
public class Testext {
    public enum SCol {
        Red, Green, Blue
    };

    public static void main(String[] args) {
        System.out.println(SCol.valueOf("Red"));
        for (SCol color : SCol.values()) {     // values()  返回Scol类型数组
            System.out.println(color);     //输出:Red Green Blue
        }
    }
}
静态方法:valueOf() 和values() 在编译时产生,不会在源代码中出现。
也就是你在JDK文档的 java.lang.Enum<E> 类中找不到这两个方法!

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马