参考网址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();
}

java enum类探索的更多相关文章

  1. java enum类自定义属性

    enum类自定义属性 这就是enum比static静态变量好用的地方了,可以赋予每一个枚举值若干个属性,例如 实例1: public enum GasStationChannel { ZH(" ...

  2. java enum类

    1.可以在enum中添加变量和方法 先来看一段代码示例: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...

  3. java 枚举类小结 Enum

    好久没有接触枚举类了,差不多都忘了,今天抽出个时间总结一下吧.说实话,枚举类确实能够给我们带来很大的方便. 说明:枚举类它约定了一个范围,可以理解成只可以生成固定的几个对象让外界去调用,故枚举类中的构 ...

  4. JAVA基础--常用类 String,StringBuffer, 基础数据类型包装类, Math类, Enum类

    字符串相关类: String, StringBuffer String类为不可变的字符序列 String s1="hello"; String s2="hello&quo ...

  5. Java Enum 枚举类的values方法

    Enum类和enum关键字定义的类型都有values方法,但是点进去会发现找不到这个方法.这是因为java编译器在编译这个类(enum关键字定义的类默认继承java.lang.Enum)的时候 自动插 ...

  6. Java 基础复习 -- Enum 类

    一.枚举类基本语法 在 Java SE5 中添加了一个看似很小的特性,即 enum 关键字,它使得我们在需要群组并使用枚举类型集时,可以很方便的处理. 所有的 enum 都继承自 java.lang. ...

  7. 如何使用Java中的Enum类

    Java1.5 中出现了枚举类型.当一个值都在一个固定的范围内变化,那就可以使用 enum 类型来定义.比如说,一周有七天,一年有四季. 没有枚举类的时候,我们用常量来定义一组范围值的: public ...

  8. java enum

    小谈Java Enum的多态性 博客分类: Java JavaAppleJDKJVMIDEA  Enum+多态,我没说错,不过Enum是不可以被继承的,也不可以继承自别人,只是能实现接口而已,何谈多态 ...

  9. 【转】Java enum的用法详解

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

随机推荐

  1. RobotFrameWork框架介绍与安装

    一.RobotFrameWork介绍 1.简称RF,基于python研发的一款自动化测试框架.开源.跨平台的测试框架 2.RF是基于RF基金来研发的一款软件,目前已完全能够在python3环境下应用 ...

  2. 多项式的各类计算(多项式的逆/开根/对数/exp/带余除法/多点求值)

    预备知识:FFT/NTT 多项式的逆 给定一个多项式 F(x)F(x)F(x),请求出一个多项式 G(x)G(x)G(x),满足 F(x)∗G(x)≡1(mod xn)F(x)*G(x) \equiv ...

  3. C#线程池 ThreadPool

    什么是线程池 大家都知道,我们在打开一个应用的时候,操作系统是要做很多的事情的,动态链接.装载.分配虚拟空间.等等等等,其实一个应用的打开同时也伴随着一个进程的建立. 进程的建立是需要时间的,在进程上 ...

  4. 创建nextcloud所需的数据库和账户

      创建 nextcloud 所需的数据库和账户 打开数据库管理命令行,默认root没密码,回车进入 sudo mysql -u root -p 创建 nextcloud 数据库,命令包含后面的分号 ...

  5. Tomcat启动问题:严重[main] org.apache.catalina.core.AprLifecycleListener.init An incompatible version...

    今天观察tomcat启动日志,有一些以前没注意到的信息: 严重 [main] org.apache.catalina.core.AprLifecycleListener.init An incompa ...

  6. 计蒜客 39270.Angel's Journey-简单的计算几何 ((The 2019 ACM-ICPC China Shannxi Provincial Programming Contest C.) 2019ICPC西安邀请赛现场赛重现赛

    Angel's Journey “Miyane!” This day Hana asks Miyako for help again. Hana plays the part of angel on ...

  7. 初识 Python 作业及默写

    1.简述变量量命名规范 2.name = input(“>>>”) name变量是什么数据类型? 3.if条件语句的基本结构? 4.用print打印出下面内容: 文能提笔安天下, 武 ...

  8. mysql 唯一键

    唯一键特点: 1.唯一键在一张表中可以有多个. 2.唯一键允许字段数据为NULL,NULL可以有多个(NULL不参与比较) //一个表中允许存在多个唯一键,唯一键允许为空,在不为空的情况下,不允许重复 ...

  9. idea乱码问题

    ## 1. 文件中内容中文乱码 这个原因是文件的编码和项目的编码不一致导致,将项目工程和文件的编码设置成一致的(如,文件编码是GBK,那就都设置为GBK,若为UTF-8就都设置为UTF-8) ## 2 ...

  10. SpringMVC(中)

    一.传值方式 (1)Map Controller @Controller public class MyController { @RequestMapping("first") ...