java enum类探索
参考网址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类探索相关推荐
- java enum类默认常量是什么_Java枚举类型enum的详解及使用
Java枚举类型enum的详解及使用 最近跟同事讨论问题的时候,突然同事提到我们为什么Java 中定义的常量值不采用enmu 枚举类型,而采用public final static 类型来定义呢?以前 ...
- Java中的enum详细解析------全面掌握Java的enum类
枚举类型是JDK5.0的新特征.Sun引进了一个全新的关键字enum来定义一个枚举类.下面就是一个典型枚举类型的定义: Java代码 public enum Color{ RED,BL ...
- java enum枚举类的用法以及高级玩法
enum(枚举)类介绍 java枚举类是一组预定义常量的集合,使用enum关键字声明这个类,常量名称官方建议大写 1.enum类基本用法 举一个常见的例子,例如星期就可以描述为一个枚举类,如下 pub ...
- 从普通类的角度理解java的enum类型,用自定义类来模拟实现enum类的功能
enum定以的类型就是一个类,一个类,一个类.重要的事情说三遍.用javac编译好enum类型后,会看到一个xxx.class文件,表明enum类型也是一个类. 本文中,我们用一个普通类去定义常量,模 ...
- java枚举类Enum入门理解
目录 枚举的定义 JDK5.0之前只能自定义枚举类 自定义枚举类的理解: JDK5.0之后enum关键字定义枚举类 区别于自定义枚举类 enum的父类Enum的常用方法 toString方法和valu ...
- java 枚举类型enum ppt,关于JAVA枚举类使用的异常
当前位置:我的异常网» J2SE » 关于JAVA枚举类使用的异常 关于JAVA枚举类使用的异常 www.myexceptions.net 网友分享于:2013-01-24 浏览:5次 关于JAV ...
- 诚之和:Java基础知识枚举Enum类介绍以及案例使用详解
Java语言中的数据类型可以分为两大类,分别是基本数据类型和引用数据类型.本篇文章要介绍的枚举,就是属于Java的引用数据类型.下面,将为大家详细介绍Java中的枚举,以及具体的使用案例. 一.文章序 ...
- java enum 父类_枚举基类Enum详解
本文主要是对枚举类型的基类Enum类做一个介绍: 首先,Enum类位于java.lang包下,根据类的介绍可以发现,Enum类是Java中所有枚举类的父类,将枚举作为一个set或者Map的keys来使 ...
- enum 1.0 java 枚举类
文章目录 枚举类 1. 使用静态常量表示枚举 2. 通过定义类的方式表达枚举 3. 枚举类 4. 枚举类实现接口 每个枚举实例实现自己的方法 5. 包含抽象方法的枚举类 枚举类 在某些情况下,一个类的 ...
最新文章
- CC2540获取本机MAC地址
- Deactivate .NET refector
- java输入数量扑克牌排序_Java扑克游戏(多人多牌数比较游戏)的实现
- 景点门票销售系统系统java_某景点门票销售管理系统
- CGLib动态代理原理
- 【python】Python的基本数据类型之数据转换
- ubunut14.04修改时区,查看版本信息
- 毕业设计 基于大数据的社交平台数据爬虫舆情分析可视化系统
- centos操作系统镜像文件下载
- 傲梅分区助手 linux,傲梅分区助手专业版
- c语言打印100以内质数,C语言 · 打印1~100间的质数(素数)
- 回首13我们奋斗在14的路上
- 牛客NOIP暑期七天营-普及组4 D-火龙果画
- Edit plus | ecli pse配色方案
- (Tekla Structures二次开发)使用VS创建Tekla Structures插件的模板
- 计算机基础知识与公文写作,公文写作与计算机基础知识.doc
- 国标流媒体服务器以ROOT身份运行提示“permission denide”报错解决
- PPT转MP4和生成验证码
- FTP文件传输协议(英文:File Transfer Protocol,缩写:FTP)
- Fc2显示服务器拥挤,fc2视频全攻略
热门文章
- 极大似然估计、拉普拉斯平滑定理、M-估计详解
- 常见损失函数及正则项
- mysql5.6 pid_MySQL5.6启动报错The server quit without updating PID file
- HTML Img Compression(压缩)
- 用c语言计算2的n次方,计算2的N次方........有什么错吗?
- Egret在Chrome浏览器中的内存占用(内存泄露)
- SQL - 创建一个学生表,要求有主键约束和非空约束
- /*携程面试*/四个数组,都已经排好序,找出四个数组的交集
- A站有一个页面需要PV统计 A站读写该数据 B站读该数据 需要数据同步
- wpf 创建附加属性实例