参考网址1, 参考网址2

一直对枚举有点迷惑,现在试着理解枚举。

1.首先,普通类与枚举 的区别。拿两个例子比较吧

普通类:

1 /**
2  * 一个普通类
3  * @author Administrator
4  *
5  */
6 class aClass{
7
8 }

枚举类:

 1 /**
 2  * 一个枚举类
 3  * @author Administrator
 4  *
 5  */
 6 enum aEnum{
 7     A,
 8     B,
 9     C,
10     D,
11 }

注意,枚举元素用逗号“,”分隔,最后一个元素的逗号有和没都无所谓

模糊理解:枚举类内,每个枚举都是一个对象,一个枚举类,相当于一个包含很多对象的arraylist

补充:

1、

aEnum枚举类就是class,而且是一个不可以被继承的final类。其枚举值(A,B...)都是aEnum类型的类静态常量, 我们可以通过下面的方式来得到aEnum枚举类的一个实例:

aEnum a = aEnum.A; 
注意:这些枚举值都是public static final的,也就是我们经常所定义的常量方式,因此枚举类中的枚举值最好全部大写。

2、即然枚举类是class,当然在枚举类型中有构造器,方法和数据域。但是,枚举类的构造器有很大的不同: 
      (1) 构造器只是在构造枚举值的时候被调用。

(2) 构造器只能私有private,绝对不允许有public构造器。 这样可以保证外部代码无法新构造枚举类的实例。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。 但枚举类的方法和数据域可以允许外部访问。

3、所有枚举类都继承了Enum的方法,下面我们详细介绍这些方法。 
       (1)  ordinal()方法: 返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。
                 Color.RED.ordinal();  //返回结果:0
                 Color.BLUE.ordinal();  //返回结果:1
       (2)  compareTo()方法: Enum实现了java.lang.Comparable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出ClassCastException()异常。(具体可见源代码)
                 Color.RED.compareTo(Color.BLUE);  //返回结果 -1
       (3)  values()方法: 静态方法,返回一个包含全部枚举值的数组。
                 Color[] colors=Color.values();
                 for(Color c:colors){
                        System.out.print(c+","); 
                 }//返回结果:RED,BLUE,BLACK YELLOW,GREEN,
       (4)  toString()方法: 返回枚举常量的名称。
                 Color c=Color.RED;
                 System.out.println(c);//返回结果: RED
       (5)  valueOf()方法: 这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。
                 Color.valueOf("BLUE");   //返回结果: Color.BLUE
       (6)  equals()方法: 比较两个枚举类对象的引用。

2.自定义枚举

有时候需要稍微复杂一点的枚举,那么可以定义一个

    public enum Light {// 利用构造函数传参,生成枚举对象RED(1,"红色"), GREEN(3,"绿色"), YELLOW(2,"黄色");// 定义私有变量private int nCode;private String ss;// 构造函数,枚举类型只能为私有private Light(int _nCode,String ss) {this.nCode = _nCode;this.ss = ss;}     @Overridepublic String toString() {return String.valueOf(this.nCode+"_"+this.ss);}}

注意:最后一个枚举元素要以“;”结尾

3.枚举的使用:

        Light[] allLight = Light.values();//获得该枚举类所有的枚举对象for (Light aLight : allLight) {        //遍历对象
            System.out.println("返回枚举的名字:" + aLight.name());//得到枚举的名字System.out.println("返回枚举的位置序列号:" + aLight.ordinal());//得到枚举的位置序列号
System.out.println("打印枚举:" + aLight);//枚举的toString方法,没有覆盖toString方法的话,默认是返回枚举的名字System.out.println("打印枚举自变量:" + aLight.nCode);//得到枚举里面的参数System.out.println("打印枚举自变量:" + aLight.ss);//得到枚举里面的参数                       System.out.println("自定义的toString:" + aLight.toString());//可以覆盖toString方法System.out.println("类中其他枚举对象:" + aLight.GREEN);//具体某一个aLightSystem.out.println("类中其他枚举对象的变量:" + aLight.GREEN.ss);}

4.枚举转换arraylist

        ArrayList< Light> EnumArray = new ArrayList<Light>();for (Light aLight : allLight) {        //遍历对象
            EnumArray.add(aLight);System.out.println("###枚举对象:"+aLight);}

5.EnumMap 与 Enum

       // 1.演示定义EnumMap对象,EnumMap对象的构造函数需要参数传入,默认是key的类的类型
EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>(Light.class);currEnumMap.put(Light.RED, "红灯");currEnumMap.put(Light.GREEN, "绿灯");currEnumMap.put(Light.YELLOW, "黄灯");// 2.遍历对象for (Light aLight : Light.values()) {System.out.println("[key=" + aLight.name() + ",value="+ currEnumMap.get(aLight) + "]");}

6.EnumSet 与 Enum

   /*** * 演示EnumSet如何使用,EnumSet是一个抽象类,获取一个类型的     枚举类型内容<BR/>* * 可以使用allOf方法*/
EnumSet<Light> currEnumSet = EnumSet.allOf(Light.class);for (Light aLightSetElement : currEnumSet) {System.out.println("当前EnumSet中数据为:" + aLightSetElement);}

7.Enum 的继承和实现接口

由于所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类

所以,Enum只能选择实现接口

public interface Behaviour {void print();String getInfo();}public enum Color implements Behaviour {RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);// 成员变量private String name;private int index;// 构造方法private Color(String name, int index) {this.name = name;this.index = index;}// 接口方法
@Overridepublic String getInfo() {return this.name;}// 接口方法
        @Overridepublic void print() {System.out.println(this.index + ":" + this.name);}}

 8.枚举在反射中的应用

Class类的getEnumConstants方法可以获得类中枚举数组Enum<?>[]

 1     ArrayList<Enum<?>> result = new ArrayList<Enum<?>>();//枚举类--转换为--数组
 2         try {
 3             Class<?> myEnum = Class.forName("my.myEnum");
 4             Enum<?>[] enums = (Enum[])myEnum.getEnumConstants();
 5             System.out.println("枚举长度:"+enums.length);
 6             for(Enum<?> e : enums){
 7                 System.out.println("e:"+e);
 8                 System.out.println("e.name:"+e.name());
 9
10                 System.out.println("枚举所在类的名字:"+e.getClass().getName());
11                 result.add(e);
12             }
13
14         } catch (ClassNotFoundException e) {
15             // TODO Auto-generated catch block
16             e.printStackTrace();
17         }

转载于:https://www.cnblogs.com/jasonstorm/p/5660750.html

java enum类探索相关推荐

  1. java enum类默认常量是什么_Java枚举类型enum的详解及使用

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

  2. Java中的enum详细解析------全面掌握Java的enum类

    枚举类型是JDK5.0的新特征.Sun引进了一个全新的关键字enum来定义一个枚举类.下面就是一个典型枚举类型的定义: Java代码  public enum Color{        RED,BL ...

  3. java enum枚举类的用法以及高级玩法

    enum(枚举)类介绍 java枚举类是一组预定义常量的集合,使用enum关键字声明这个类,常量名称官方建议大写 1.enum类基本用法 举一个常见的例子,例如星期就可以描述为一个枚举类,如下 pub ...

  4. 从普通类的角度理解java的enum类型,用自定义类来模拟实现enum类的功能

    enum定以的类型就是一个类,一个类,一个类.重要的事情说三遍.用javac编译好enum类型后,会看到一个xxx.class文件,表明enum类型也是一个类. 本文中,我们用一个普通类去定义常量,模 ...

  5. java枚举类Enum入门理解

    目录 枚举的定义 JDK5.0之前只能自定义枚举类 自定义枚举类的理解: JDK5.0之后enum关键字定义枚举类 区别于自定义枚举类 enum的父类Enum的常用方法 toString方法和valu ...

  6. java 枚举类型enum ppt,关于JAVA枚举类使用的异常

    当前位置:我的异常网» J2SE » 关于JAVA枚举类使用的异常 关于JAVA枚举类使用的异常 www.myexceptions.net  网友分享于:2013-01-24  浏览:5次 关于JAV ...

  7. 诚之和:Java基础知识枚举Enum类介绍以及案例使用详解

    Java语言中的数据类型可以分为两大类,分别是基本数据类型和引用数据类型.本篇文章要介绍的枚举,就是属于Java的引用数据类型.下面,将为大家详细介绍Java中的枚举,以及具体的使用案例. 一.文章序 ...

  8. java enum 父类_枚举基类Enum详解

    本文主要是对枚举类型的基类Enum类做一个介绍: 首先,Enum类位于java.lang包下,根据类的介绍可以发现,Enum类是Java中所有枚举类的父类,将枚举作为一个set或者Map的keys来使 ...

  9. enum 1.0 java 枚举类

    文章目录 枚举类 1. 使用静态常量表示枚举 2. 通过定义类的方式表达枚举 3. 枚举类 4. 枚举类实现接口 每个枚举实例实现自己的方法 5. 包含抽象方法的枚举类 枚举类 在某些情况下,一个类的 ...

最新文章

  1. CC2540获取本机MAC地址
  2. Deactivate .NET refector
  3. java输入数量扑克牌排序_Java扑克游戏(多人多牌数比较游戏)的实现
  4. 景点门票销售系统系统java_某景点门票销售管理系统
  5. CGLib动态代理原理
  6. 【python】Python的基本数据类型之数据转换
  7. ubunut14.04修改时区,查看版本信息
  8. 毕业设计 基于大数据的社交平台数据爬虫舆情分析可视化系统
  9. centos操作系统镜像文件下载
  10. 傲梅分区助手 linux,傲梅分区助手专业版
  11. c语言打印100以内质数,C语言 · 打印1~100间的质数(素数)
  12. 回首13我们奋斗在14的路上
  13. 牛客NOIP暑期七天营-普及组4 D-火龙果画
  14. Edit plus | ecli pse配色方案
  15. (Tekla Structures二次开发)使用VS创建Tekla Structures插件的模板
  16. 计算机基础知识与公文写作,公文写作与计算机基础知识.doc
  17. 国标流媒体服务器以ROOT身份运行提示“permission denide”报错解决
  18. PPT转MP4和生成验证码
  19. FTP文件传输协议(英文:File Transfer Protocol,缩写:FTP)
  20. Fc2显示服务器拥挤,fc2视频全攻略

热门文章

  1. 极大似然估计、拉普拉斯平滑定理、M-估计详解
  2. 常见损失函数及正则项
  3. mysql5.6 pid_MySQL5.6启动报错The server quit without updating PID file
  4. HTML Img Compression(压缩)
  5. 用c语言计算2的n次方,计算2的N次方........有什么错吗?
  6. Egret在Chrome浏览器中的内存占用(内存泄露)
  7. SQL - 创建一个学生表,要求有主键约束和非空约束
  8. /*携程面试*/四个数组,都已经排好序,找出四个数组的交集
  9. A站有一个页面需要PV统计 A站读写该数据 B站读该数据 需要数据同步
  10. wpf 创建附加属性实例