参考网址1, 参考网址2

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

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

普通类:

 /**
* 一个普通类
* @author Administrator
*
*/
class aClass{ }

枚举类:

 /**
* 一个枚举类
* @author Administrator
*
*/
enum aEnum{
A,
B,
C,
D,
}

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

模糊理解:枚举类内,每个枚举都是一个对象,一个枚举类,相当于一个包含很多对象的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;
}     
@Override
public 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);//具体某一个aLight
System.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;
} // 接口方法 @Override
public String getInfo() {
return this.name;
} // 接口方法
@Override
public void print() {
System.out.println(this.index + ":" + this.name);
}
}

 8.枚举在反射中的应用

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

     ArrayList<Enum<?>> result = new ArrayList<Enum<?>>();//枚举类--转换为--数组
try {
Class<?> myEnum = Class.forName("my.myEnum");
Enum<?>[] enums = (Enum[])myEnum.getEnumConstants();
System.out.println("枚举长度:"+enums.length);
for(Enum<?> e : enums){
System.out.println("e:"+e);
System.out.println("e.name:"+e.name()); System.out.println("枚举所在类的名字:"+e.getClass().getName());
result.add(e);
} } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

最新文章

  1. ASP.NET跨平台最佳实践
  2. MongoDB管理工具的插件系统
  3. 关于google电子地图跟卫星地图位置不重合
  4. CodeIgniter 让控制器可以支持多级子目录的 Router 类库
  5. oracle impdp的table_exists_action详解
  6. Symfony VarDumper Component
  7. mysql 索引优化
  8. 【机房系统知识小结】微软自带RDLC报表,数据汇总设计
  9. MYSQL查看和修改存储引擎
  10. 工控随笔_02_西门子_WinCC的IO域利用C脚本返回值
  11. c# 获取本机IP
  12. 使用TortoiseSVN创建版本库
  13. 处理后台向前台传递的json数据
  14. ffplay源码分析6-音频重采样
  15. 主席树初步学习笔记(可持久化数组?静态区间第k大?)
  16. Chapter 6 -- Caches
  17. 《Lua程序设计》第4章 语句 学习笔记
  18. AGC009D Uninity
  19. CCTableView(一)
  20. Mac下,如何把Github上的仓库删除掉

热门文章

  1. 如何打开.ipynb文件
  2. rustup 使用
  3. Lightning Web Components 组件样式(四)
  4. 【洛谷P3369】普通平衡树——Splay学习笔记(一)
  5. mysql addtime() 函数
  6. SDN阅读作业(二)
  7. Java获取当天、当前月、当前年(今年)的开始和结束时间戳
  8. 【解决方案】Chrome崩溃问题解决
  9. maven 发现有一个包 需要升级包版本
  10. Web前端开发规范之脚本文件和动态文本文件命名规则