枚举类型概念

  1. package com.lxq.enumm;
  2. public class EnumDemoOne
  3. {
  4. private enum InnerEnum
  5. {
  6. RED, GREEN, YELLOW
  7. };
  8. public static void main(String[] args)
  9. {
  10. System.out.println(InnerEnum.RED);
  11. System.out.println(InnerEnum.GREEN);
  12. System.out.println(InnerEnum.YELLOW);
  13. }
  14. }

运行上面的代码,将编辑产生EnumDemoOne.class和EnumDemoOne$InnerEnum.class。

由此说明定义枚举类型其实就是在定义一个类,只不过很多细节由编译器帮你补齐了,所以,某种程度上enum关键词的作用就像是class或interface.当使用enum定义枚举类型时,实际上所定义出来的类型是继承自java.lang.Enum类。而每个被枚举的成员其实就是定义的枚举类型的一个实例,它们都被默认为final。无法改变常数名称所设定的值,它们也是public和static的成员,这与接口中的常量限制相同。可以通过类名称直接使用它们。

Java枚举类型的案例一

  1. package com.lxq.enumm;
  2. public class EnumDemoTwo
  3. {
  4. public enum ColorSelect
  5. {
  6. red, green, yellow, blue;
  7. }
  8. public static void main(String[] args)
  9. {
  10. /*
  11. * 枚举类型是一种类型,用于定义变量,以限制变量的赋值 赋值时通过"枚举名.值"来取得相关枚举中的值
  12. */
  13. ColorSelect m = ColorSelect.blue;
  14. switch (m)
  15. {
  16. /*注意:枚举重写了ToString(),说以枚举变量的值是不带前缀的
  17. * 所以为blue而非ColorSelect.blue
  18. */
  19. case red:
  20. System.out.println("color is red");
  21. break;
  22. case green:
  23. System.out.println("color is green");
  24. break;
  25. case yellow:
  26. System.out.println("color is yellow");
  27. break;
  28. case blue:
  29. System.out.println("color is blue");
  30. break;
  31. }
  32. System.out.println("遍历ColorSelect中的值");
  33. /*通过values()获得枚举值的数组*/
  34. for (ColorSelect c : ColorSelect.values())
  35. {
  36. System.out.println(c);
  37. }
  38. System.out.println("枚举ColorSelect中的值有:"+ColorSelect.values().length+"个");
  39. /*ordinal()返回枚举值在枚举中的索引位置,从0开始*/
  40. System.out.println(ColorSelect.red.ordinal());//0
  41. System.out.println(ColorSelect.green.ordinal());//1
  42. /*name()返回枚举值在枚举中的索引位置,从0开始*/
  43. System.out.println(ColorSelect.yellow.name());//yellow
  44. System.out.println(ColorSelect.blue.name());//blue
  45. /*枚举默认实现了java.lang.Comparable接口,-1之前,0位置相同,1之后*/
  46. System.out.println(ColorSelect.red.compareTo(ColorSelect.green));
  47. /*静态valueOf()方法可以让您将指定的字符串尝试转换为枚举类型*/
  48. ColorSelect red=ColorSelect.valueOf("red");
  49. System.out.println(red.getClass());
  50. }
  51. }

Java枚举类型的案例二

上面案例一的枚举类型的返回值仅仅是该枚举变量的名称而已,我们当然也可以通过参数自己制定更加友好更加形象的枚举类型的返回值。

下面的代码简单来说,就箱单我们有一个类,类中有构造方法和变量clor,那么我们通过new Light("颜色");就可以新建一个类的实例,其实枚举就是这个意思,

RED ("红色"), GREEN ("绿色"), YELLOW ("黄色");这三个就当然于实例化了三个对象。也就是Light RED=new Light("红色"); Light GREEN=new Light("绿色");
Light YELLOW=new Light("黄色");只不过定义了枚举类型后,剩下的工作由java编译器帮我们完成了。

  1. package com.lxq.enumm;
  2. import java.util.EnumMap;
  3. import java.util.EnumSet;
  4. public class EnumDemoThree{
  5. // 1. 定义枚举类型
  6. public enum Light {
  7. /*利用构造函数传参利用构造函数传参
  8. * 通过括号赋值,而且必须有带参构造器和属性和方法,否则编译出错
  9. * 赋值必须是都赋值或都不赋值,不能一部分赋值一部分不赋值
  10. * 如果不赋值则不能写构造器,赋值编译也出错
  11. * */
  12. RED ("红色"), GREEN ("绿色"), YELLOW ("黄色");
  13. // 定义私有变量
  14. private String clor ;
  15. // 构造函数,枚举类型只能为私有
  16. private Light(String clor) {
  17. this.clor = clor;
  18. }
  19. public String getClor(){
  20. return this.clor;
  21. }
  22. public void setClor(String clor){
  23. this.clor=clor;
  24. }
  25. @Override
  26. public String toString() {
  27. return this.clor;
  28. }
  29. }
  30. /**
  31. * @param args
  32. */
  33. public static void main(String[] args ) {
  34. // 1. 遍历枚举类型
  35. System.out.println( " 演示枚举类型的遍历 ......" );
  36. testTraversalEnum ();
  37. // 2. 演示 EnumMap 对象的使用
  38. System. out .println( " 演示 EnmuMap 对象的使用和遍历 ....." );
  39. testEnumMap ();
  40. // 3. 演示 EnmuSet 的使用
  41. System. out .println( " 演示 EnmuSet 对象的使用和遍历 ....." );
  42. testEnumSet ();
  43. }
  44. /**
  45. * 演示枚举类型的遍历
  46. */
  47. private static void testTraversalEnum() {
  48. Light[] allLight = Light.values ();
  49. for (Light aLight : allLight) {
  50. System. out .println( " 当前灯 name : " + aLight.name());
  51. System. out .println( " 当前灯 ordinal : " + aLight.ordinal());
  52. System. out .println( " 当前灯: " + aLight);
  53. }
  54. }
  55. /**
  56. * 演示 EnumMap 的使用, EnumMap 跟 HashMap 的使用差不多,只不过 key 要是枚举类型
  57. */
  58. private static void testEnumMap() {
  59. // 1. 演示定义 EnumMap 对象, EnumMap 对象的构造函数需要参数传入 , 默认是 key 的类的类型
  60. EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>(
  61. Light. class );
  62. currEnumMap.put(Light. RED , " 红灯 " );
  63. currEnumMap.put(Light. GREEN , " 绿灯 " );
  64. currEnumMap.put(Light. YELLOW , " 黄灯 " );
  65. // 2. 遍历对象
  66. for (Light aLight : Light.values ()) {
  67. System. out .println( "[key=" + aLight.name() + ",value="
  68. + currEnumMap.get(aLight) + "]" );
  69. }
  70. }
  71. /**
  72. * 演示 EnumSet 如何使用, EnumSet 是一个抽象类,获取一个类型的枚举类型内容 <BR/>
  73. * 可以使用 allOf 方法
  74. */
  75. private static void testEnumSet() {
  76. EnumSet<Light> currEnumSet = EnumSet.allOf (Light. class );
  77. for (Light aLightSetElement : currEnumSet) {
  78. System. out .println( " 当前 EnumSet 中数据为: " + aLightSetElement);
  79. }
  80. }
  81. }

Java枚举类型的案例三

案例三在二的基础上增加了构造时的参数个数,使得这样的枚举有更广泛的用处。

  1. package com.lxq.enumm;
  2. public enum EnumConstant
  3. {
  4. WEEK_00("", "请选择"),WEEK_01("01", "周一"), WEEK_02("02", "周二"), WEEK_03("03", "周三");
  5. private String key;
  6. private String value;
  7. //自定义的构造函数,参数数量,名字随便自己取
  8. //构造器默认也只能是private, 从而保证构造函数只能在内部使用
  9. private EnumConstant(String key, String value)
  10. {
  11. this.key = key;
  12. this.value = value;
  13. }
  14. public String getKey()
  15. {
  16. return key;
  17. }
  18. public void setKey(String key)
  19. {
  20. this.key = key;
  21. }
  22. public String getValue()
  23. {
  24. return value;
  25. }
  26. public void setValue(String value)
  27. {
  28. this.value = value;
  29. }
  30. //重新toString方法,默认的toString方法返回的就是枚举变量的名字,和name()方法返回值一样
  31. @Override
  32. public String toString()
  33. {
  34. return this.key+":"+this.value;
  35. }
  36. }
  1. package com.lxq.enumm;
  2. public class EnumTest
  3. {
  4. /**
  5. * @param args
  6. */
  7. public static void main(String[] args)
  8. {
  9. EnumConstant[] allday = EnumConstant.values();
  10. System.out.println("-----------for begin------------------");
  11. for (EnumConstant day : allday)
  12. {
  13. System.out.println("  name : " + day.name());//枚举变量的名称
  14. System.out.println("  ordinal : " + day.ordinal());//枚举变量的序号
  15. System.out.println("  : " + day);//就是toString()的返回值
  16. System.out.println("  key : " + day.getKey());//取得第一个参数
  17. System.out.println("  value : " + day.getValue());//取得第二个参数
  18. }
  19. System.out.println("-----------for end------------------");
  20. System.out.println(EnumConstant.WEEK_00);//就是toString()的返回值
  21. System.out.println(EnumConstant.WEEK_01);//就是toString()的返回值
  22. System.out.println(EnumConstant.WEEK_02);//就是toString()的返回值
  23. System.out.println(EnumConstant.WEEK_03);//就是toString()的返回值
  24. }
  25. }

PS:我常把Light叫做枚举类型,把其中的RED等叫做枚举变量或枚举值。

本以为RED只是一个Light类的一个static final的实例而已。但后然发现不是这样的,所以文中相关表述不正确的已加中划线,

正确的枚举类型原理见下一篇,Java学习整理系列之Java枚举类型的原理http://blog.csdn.net/sup_heaven/article/details/355591

【转载】Java枚举类型的使用的更多相关文章

  1. 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)

    java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采 ...

  2. java 枚举类型分析

    最近做android开发,需要用到枚举值,这样可以连续赋值,我按之前c++那样书写,如下所示: public enum ColorSelect { RED_BAGE = 0, GREEN_BAGE, ...

  3. 【转】java枚举类型enum的使用

    原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...

  4. 【转】掌握java枚举类型(enum type)

    原文网址:http://iaiai.iteye.com/blog/1843553 1   背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用 ...

  5. Java 枚举类型简介

    目录 Java 枚举示例 Java 枚举构造函数 枚举类型是用于定义常量集合的特殊类型,更确切的说,JAVA枚举类型是一种特殊的 java 类.枚举类型可以包含常量.方法等.在 java5 中添加了 ...

  6. 深入理解Java枚举类型(enum)

    https://blog.csdn.net/javazejian/article/details/71333103 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(en ...

  7. Java枚举类型使用示例

    Java枚举类型使用示例 学习了:https://www.cnblogs.com/zhaoyanjun/p/5659811.html http://blog.csdn.net/qq_27093465/ ...

  8. Java枚举类型的使用,数值的二进制表示

    一.Java枚举类型的使用 首先请看这段代码: package java上课; public class EnumTest { public static void main(String[] arg ...

  9. java枚举类型(转载)

    public class TestEnum {     /*最普通的枚举*/     public enum ColorSelect {         red, green, yellow, blu ...

随机推荐

  1. Python time模块详解--转载

    1.在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主要调用C库,所以各个平台可能有所 ...

  2. Redis<一> 数据结构:String

    ). set key value : 将字符串值 value 关联到 key .如果 key 已经持有其他值, SET 就覆写旧值,无视类型. ). get key : 返回 key 所关联的字符串值 ...

  3. Codeforces 352B - Jeff and Periods

    352B - Jeff and Periods 思路:水题,考验实现(implementation)能力,来一波vector[允悲]. 代码: #include<bits/stdc++.h> ...

  4. CodeSmith无法获取Oracle表注释

    如题:安装CodeSmith5.2版本,SQLServer没有任何问题,而Oracle就只能获取列的注释而不能获取表的注释,经过多方面查找资料后找到了一个最重要的解决方案,Sql语句,如下:selec ...

  5. Java基础十一--多态

    Java基础十一--多态 一.多态定义 简单说:就是一个对象对应着不同类型. 多态在代码中的体现: 父类或者接口的引用指向其子类的对象. /* 对象的多态性. class 动物 {} class 猫 ...

  6. Xshell Xftp 免费版 (xshell6 评估期已过 解决办法)

    xshell6 评估期已过,因为下载的版本是evaluation版本,是有期限的. 大家可以修改为Home and school use 的版本,这样就不会出现这个提示了. 具体的操作步骤如下: 1. ...

  7. php file_get_contents计时读取一个文件/页面 防止读取不到内容

    php file_get_contents计时读取一个文件/页面 防止读取不到内容 $url = 'http://www.baidu.com/index.php'; $opts = array( 'h ...

  8. English trip -- VC(情景课)2 B Classroom objects

    Vocabulary focus 核心词汇 Listen and repeat. 听并跟读 1. a dictionary 2. paper 3. a pen 4. a ruler 5. a stap ...

  9. php--------文件夹文件拷贝和复制

    php开发中常常对文件进行操作,文件夹和文件的拷贝,复制等. /** * 文件夹文件拷贝 * * @param string $src 来源文件夹 * @param string $dst 目的地文件 ...

  10. Confluence 6 嵌套用户组的示例

    示例 1 : 用是一个子用户组成员 想象在你的目录服务器中,存在下面 2 个用户组: staff marketing 成员: marketing 用户组是  staff 的成员. 用户 jsmith ...