Java枚举类型小结
来源:互联网 发布:商城源码单用户版 编辑:程序博客网 时间:2024/06/07 05:33
Java枚举类型小结
Java5 中引入了一个新的关键字——enum。我们可以利用enum来创建枚举。Java中的枚举也是一种类。它可以有自己的成员变量、方法,也可以实现接口、定义自己的构造器。同其他类一样,每个Java原文件中只能定义一个public访问权限的枚举类,且此public枚举类名需和Java源文件名相同。
枚举类和其他类的不同点
- 不能显示继承其他父类
- enum定义的枚举类默认继承了java.lang.Enum类,由于Java不支持多重继承,因此不可显式继承它者。
- 默认实现了Serilizable和Comparable接口
- 默认会被final修饰,无法派生子类
- 注意:如果枚举类中含有抽象方法,则它就会被修饰为abstract而非final了
- 构造器必须为private
- 缺省状态下为private
- 如果显式执行,也只能指定为private
- 这也是为何枚举类型变量无法在外部new出来,而只能引用已有者的缘故
- 所有实例必须在第一行显示列出,否则它将永远无法产生实例
- 实例会被自动修饰为”public static final”
枚举类的定义
private enum Gender{ MALE,FEMALE;}
可为其添加成员变量:
private enum Gender{ MALE,FEMALE; public String name;}
可为其添加方法。如本例,可添加一个setter && getter 以增强封装性:
private enum Gender { MALE, FEMALE; private String name; public String getName() { return name; } public void setName(String name) { if (this == MALE && name.equals("man") || this == FEMALE && name.equals("woman")) { this.name = name; } else { System.out.println("parms ERROR"); } }}
可为其添加构造器。如本例,可利用构造器增加枚举类的不可变性:
private enum Gender{ MALE("man"), FEMALE("female"); private final String name; Gender(String name){ this.name = name; } public String getName(){ return this.name; }}
可让其实现接口。
public class Main { private interface ShowInfo{ void showInfo(); } private enum Gender implements ShowInfo { MALE("man"), FEMALE("female"); private final String name; Gender(String name) { this.name = name; } public String getName() { return this.name; } @Override public void showInfo() { System.out.println("This is enum Gender"); } } public static void main(String[] args) { Gender.MALE.showInfo(); Gender.FEMALE.showInfo(); }}
读者会发现,这样实现接口的话,执行结果是与实例无关的。如果我们想让不同实例表现出不同结果,那么可以这样实现此接口:
private enum Gender implements ShowInfo { MALE("man") { @Override public void showInfo() { System.out.println("This is MALE"); } }, FEMALE("female") { @Override public void showInfo() { System.out.println("This is FEMALE"); } }; private final String name; Gender(String name) { this.name = name; }}
我们可将其与匿名内部类的语法格式相比较,实例后的花括号就是类体,MALE&&FEMALE实例就是Gender子类的实例,在此类体中实现接口就可以将接口的行为同实例关联起来。编译上面代码将生成Gender.class、Gender
还可为枚举类添加抽象方法:
enum CONST { A { @Override public void showName() { System.out.println("This is A"); } }, B { @Override public void showName() { System.out.println("This is B"); } }; public abstract void showName();}
A和B依旧为CONST类的子类。由于含有抽象方法,因此此枚举类不再修饰为final,而是直接修饰为abstract,因此可以派生子类。
枚举的使用
判别
枚举类的元素常常用于表示一种符号,一种常量。那么最常见的使用就是对其进行判断了。样例如下:
public class Main { private enum Gender { MALE, FEMALE; } public static void main(String[] args) { // 枚举变量是不能被new出来,只能引用枚举集合中存在的元素 Gender myGender = Gender.FEMALE; if (myGender.equals(Gender.MALE)) { // 判别直接用 == 也可 System.out.println("MAN"); } else { System.out.println("FEMALE"); } }}
当然,除了if外,还可以用switch,尤其是在枚举元素较多的情况下适用。
遍历
枚举类自带有values()方法,可以用于元素的遍历
public class Main { private enum Gender { MALE, FEMALE; } public static void main(String[] args) { for(Gender elem : Gender.values()){ System.out.println(elem); } }}
这个values方法实际上返回的是个数组,因此有关数组的使用(比如用length来获取元素个数),对本方法也是有效的。
获取元素索引
利用自带的ordinal()方法即可返回某元素于枚举集合中的位置(从0开始)
public class Main { private enum Gender { MALE, FEMALE; } public static void main(String[] args) { System.out.println(Gender.FEMALE.ordinal()); // 输出:1 }}
利用已实现的Comparable接口
Enum把此接口实现为用于判断两元素位置先后,看源码不难发现,实际上返回的就是self.ordinal - other.ordinal
。看个样例:
public class Main { private enum ALPHABET { A, B, C, D, E; } public static void main(String[] args) { System.out.println(ALPHABET.A.compareTo(ALPHABET.B));//-1 System.out.println(ALPHABET.B.compareTo(ALPHABET.B));//0 System.out.println(ALPHABET.C.compareTo(ALPHABET.B));//1 }}
前者为负,后者为正,相同位置者为零。
- Java枚举类型小结
- java.lang.Enum类:枚举类型 小结
- 枚举类型小结
- C枚举类型小结
- 枚举类型小结
- JAVA入门学习小结(二)枚举类型
- java枚举用法小结
- JAVA枚举小结
- 【Java】JAVA枚举类型
- Java enum 枚举类型
- java枚举类型
- JAVA枚举类型
- JAVA枚举类型Enum
- Java中的枚举类型
- 简述java枚举类型
- java枚举类型入门
- JAVA枚举类型
- java 枚举类型
- Dynamics CRM2016 Set Values of all Data Types using Web API
- git用远程仓库强制更新本地修改,本地修改不保存
- Android权限
- python安装mysqldb模块遇到的问题和解决方法
- Solr-5.5 QuickStart
- Java枚举类型小结
- Lucener认识
- SLAM实践(1)
- QT基础(七)----File文件读写
- 一元多项式相乘 - 链表的简单应用
- HDOJ3231醉
- OpenCV拉普拉斯变换
- hadoop 中常见的异常与解决办法
- 血案之后的反思:如何以正确的姿势要求iOS用户评分?