java enum类探索
一直对枚举有点迷惑,现在试着理解枚举。
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类探索的更多相关文章
- java enum类自定义属性
enum类自定义属性 这就是enum比static静态变量好用的地方了,可以赋予每一个枚举值若干个属性,例如 实例1: public enum GasStationChannel { ZH(" ...
- 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 ...
- java 枚举类小结 Enum
好久没有接触枚举类了,差不多都忘了,今天抽出个时间总结一下吧.说实话,枚举类确实能够给我们带来很大的方便. 说明:枚举类它约定了一个范围,可以理解成只可以生成固定的几个对象让外界去调用,故枚举类中的构 ...
- JAVA基础--常用类 String,StringBuffer, 基础数据类型包装类, Math类, Enum类
字符串相关类: String, StringBuffer String类为不可变的字符序列 String s1="hello"; String s2="hello&quo ...
- Java Enum 枚举类的values方法
Enum类和enum关键字定义的类型都有values方法,但是点进去会发现找不到这个方法.这是因为java编译器在编译这个类(enum关键字定义的类默认继承java.lang.Enum)的时候 自动插 ...
- Java 基础复习 -- Enum 类
一.枚举类基本语法 在 Java SE5 中添加了一个看似很小的特性,即 enum 关键字,它使得我们在需要群组并使用枚举类型集时,可以很方便的处理. 所有的 enum 都继承自 java.lang. ...
- 如何使用Java中的Enum类
Java1.5 中出现了枚举类型.当一个值都在一个固定的范围内变化,那就可以使用 enum 类型来定义.比如说,一周有七天,一年有四季. 没有枚举类的时候,我们用常量来定义一组范围值的: public ...
- java enum
小谈Java Enum的多态性 博客分类: Java JavaAppleJDKJVMIDEA Enum+多态,我没说错,不过Enum是不可以被继承的,也不可以继承自别人,只是能实现接口而已,何谈多态 ...
- 【转】Java enum的用法详解
用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...
随机推荐
- c++中关联容器set的使用
c++中set的用法 #include<iostream> #include<vector> #include<algorithm> #include<set ...
- Apache Solr < 8.2.0远程命令执行漏洞(CVE-2019-0193)
介绍:Apache Solr 是一个开源的搜索服务器.Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现. 漏洞原因:此次漏洞出现在Apache Solr的D ...
- Python中如何使用线程池和进程池?
进程池的使用 为什么要有进程池?进程池的概念. 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务. 那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程 ...
- 一. python 安装
1. 下载安装包 1 2 3 https://www.python.org/ftp/python/2.7.14/python-2.7.14.amd64.msi # 2.7安装包 https: ...
- sql server 能按照自己规定的字段顺序展示
工作中遇到,需要把sql 查询的按照指定的顺序显示 select plantname,cc_type,all_qty from VIEW_TEMP_DAY_CVT_CAP a where a.docd ...
- 洛谷 P1717 钓鱼 题解
每日一题 day46 打卡 Analysis 首先通过题目我们不难发现,为了得到最优解,那么就不能把时间浪费在路上,也就是说不能走回头路.然后很容易可以发现,在每个时刻在不同的鱼塘钓到的鱼的数量是不同 ...
- 73: luogu 2014 树形dp
$des$ 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有 ...
- gulp+webpack多页应用开发,webpack仅处理打包js
项目背景:一个综合网站,开发模式为后端嵌套数据,前端开发静态页面和部分组件. 问题:gulp任务处理自动刷新.sass编译等都是极好的.但是对于js的处理并不是很好,尤其是项目需要开发组件时候,如评论 ...
- git:GitLab代码回滚到特定版本
在当前branch上多次commit代码并且push后,发现不符合要求,需要回滚到特定的版本.步骤如下: 1.查找commitId (1)用命令行打开git项目路径,输入git log命令查看comm ...
- Make sure you've included captcha.urls as explained in the INSTALLATION section on
原因:django-simple-captcha将客户端编号与验证码默认存储在数据库中 解决办法: python manage.py migrate