Java Enum
2015-12-01 20:56
495 查看
本文参考: http://www.cnblogs.com/frankliiu-java/archive/2010/12/07/1898721.html
1. 枚举就是一个特殊的类。
(1) 通过 enum 关键字定义,默认继承 java.lang.Enum ,所以不能再继承其他类,但可以实现接口。
(2) 由于继承自 Enum ,所以持有父类的两个私有字段 name ,ordinal 和一个带有这两个参数的构造方法。
(3) 枚举内定义的枚举个体都为该枚举的实体对象,name 和 ordinal 被默认赋值。
(4) 枚举是一个final类。可以定义属性,方法,抽象方法等。若定义属性,必须有包含全部属性的构造方法(私有,只有在枚举个体定义时才能被调用),若包含抽象方法,在枚举个体定义时必须实现该方法。
2. 枚举举例。
(1) 简单枚举
public enum Color{
RED,BLUE,BLACK,YELLOW,GREEN;
}
(2) 对代码编译之后发现,编译器将enum类型单独编译成了一个字节码文件:Color.class
final enum hr.test.Color {
// 所有的枚举值都是类静态常量
public static final enum hr.test.Color RED;
public static final enum hr.test.Color BLUE;
public static final enum hr.test.Color BLACK;
public static final enum hr.test.Color YELLOW;
public static final enum hr.test.Color GREEN;
private static final synthetic hr.test.Color[] ENUM$VALUES;
// 初始化过程,对枚举类的所有枚举值对象进行第一次初始化
static {
0 new hr.test.Color [1]
3 dup
4 ldc <String "RED"> [16] //把枚举值字符串"RED"压入操作数栈
6 iconst_0 // 把整型值0压入操作数栈
7 invokespecial hr.test.Color(java.lang.String, int) [17] //调用Color类的私有构造器创建Color对象RED
10 putstatic hr.test.Color.RED : hr.test.Color [21] //将枚举对象赋给Color的静态常量RED。
......... 枚举对象BLUE等与上同
102 return
};
// 私有构造器,外部不可能动态创建一个枚举类对象(也就是不可能动态创建一个枚举值)。
private Color(java.lang.String arg0, int arg1){
// 调用父类Enum的受保护构造器创建一个枚举对象
3 invokespecial java.lang.Enum(java.lang.String, int) [38]
};
public static hr.test.Color[] values();
// 实现Enum类的抽象方法
public static hr.test.Color valueOf(java.lang.String arg0);
}
(3) 带有扩展属性的枚举。
public enum Color {
RED("hong", 1),
BLUE("lan", 2),
BLACK("hei", 3),
YELLOW("hong", 4),
GREEN("lv", 5);
private String pinyin;
private int index;
private Color(String pinyin, int index) {
this.pinyin = pinyin;
this.index = index;
}
public String getPinyin() {
return pinyin;
}
public static String getPinyin(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
return c.pinyin;
}
}
return null;
}
public int getIndex() {
return index;
}
public int getIndex(String pin) {
for (Color c : Color.values()) {
if (c.getPinyin().equals(index)) {
return c.index;
}
}
return -1;
}
}
(4) 带有抽象方法的枚举。略
(5) 枚举在switch中的应用。略
3. 枚举继承 Enum 的所有方法。
(1) name()方法:返回该枚举个体的名称。
(2) ordinal()方法:返回该枚举个体的序列数(0...n)。
(3) clone()方法:返回异常,枚举不支持克隆。
(4) equals(Object):同一对象的引用对象相等。
(5) readObject(ObjectInputStream),readObjectNoData()私有方法:返回异常,不能反序列化枚举。
(6) toString()方法:返回枚举个体的名称name。
(7) valueOf(class, String),valueOf(String)静态方法:第一个一般用 Enum 调用,输入枚举类型和枚举个体名称,返回个体对象。第二个用枚举类调用,输入枚举个体名称,返回枚举个体对象。
(8) values()静态方法:返回一个包含全部枚举值的数组。
1. 枚举就是一个特殊的类。
(1) 通过 enum 关键字定义,默认继承 java.lang.Enum ,所以不能再继承其他类,但可以实现接口。
(2) 由于继承自 Enum ,所以持有父类的两个私有字段 name ,ordinal 和一个带有这两个参数的构造方法。
(3) 枚举内定义的枚举个体都为该枚举的实体对象,name 和 ordinal 被默认赋值。
(4) 枚举是一个final类。可以定义属性,方法,抽象方法等。若定义属性,必须有包含全部属性的构造方法(私有,只有在枚举个体定义时才能被调用),若包含抽象方法,在枚举个体定义时必须实现该方法。
2. 枚举举例。
(1) 简单枚举
public enum Color{
RED,BLUE,BLACK,YELLOW,GREEN;
}
(2) 对代码编译之后发现,编译器将enum类型单独编译成了一个字节码文件:Color.class
final enum hr.test.Color {
// 所有的枚举值都是类静态常量
public static final enum hr.test.Color RED;
public static final enum hr.test.Color BLUE;
public static final enum hr.test.Color BLACK;
public static final enum hr.test.Color YELLOW;
public static final enum hr.test.Color GREEN;
private static final synthetic hr.test.Color[] ENUM$VALUES;
// 初始化过程,对枚举类的所有枚举值对象进行第一次初始化
static {
0 new hr.test.Color [1]
3 dup
4 ldc <String "RED"> [16] //把枚举值字符串"RED"压入操作数栈
6 iconst_0 // 把整型值0压入操作数栈
7 invokespecial hr.test.Color(java.lang.String, int) [17] //调用Color类的私有构造器创建Color对象RED
10 putstatic hr.test.Color.RED : hr.test.Color [21] //将枚举对象赋给Color的静态常量RED。
......... 枚举对象BLUE等与上同
102 return
};
// 私有构造器,外部不可能动态创建一个枚举类对象(也就是不可能动态创建一个枚举值)。
private Color(java.lang.String arg0, int arg1){
// 调用父类Enum的受保护构造器创建一个枚举对象
3 invokespecial java.lang.Enum(java.lang.String, int) [38]
};
public static hr.test.Color[] values();
// 实现Enum类的抽象方法
public static hr.test.Color valueOf(java.lang.String arg0);
}
(3) 带有扩展属性的枚举。
public enum Color {
RED("hong", 1),
BLUE("lan", 2),
BLACK("hei", 3),
YELLOW("hong", 4),
GREEN("lv", 5);
private String pinyin;
private int index;
private Color(String pinyin, int index) {
this.pinyin = pinyin;
this.index = index;
}
public String getPinyin() {
return pinyin;
}
public static String getPinyin(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
return c.pinyin;
}
}
return null;
}
public int getIndex() {
return index;
}
public int getIndex(String pin) {
for (Color c : Color.values()) {
if (c.getPinyin().equals(index)) {
return c.index;
}
}
return -1;
}
}
(4) 带有抽象方法的枚举。略
(5) 枚举在switch中的应用。略
3. 枚举继承 Enum 的所有方法。
(1) name()方法:返回该枚举个体的名称。
(2) ordinal()方法:返回该枚举个体的序列数(0...n)。
(3) clone()方法:返回异常,枚举不支持克隆。
(4) equals(Object):同一对象的引用对象相等。
(5) readObject(ObjectInputStream),readObjectNoData()私有方法:返回异常,不能反序列化枚举。
(6) toString()方法:返回枚举个体的名称name。
(7) valueOf(class, String),valueOf(String)静态方法:第一个一般用 Enum 调用,输入枚举类型和枚举个体名称,返回个体对象。第二个用枚举类调用,输入枚举个体名称,返回枚举个体对象。
(8) values()静态方法:返回一个包含全部枚举值的数组。
相关文章推荐
- android studio导入eclipse项目方式及相关问题解决办法
- java子类实例初始化过程
- Java新手之路——Day05 运算符
- Java相似知识点区别
- java编程思想(读书笔记):1.对象导论
- Java的抽象类和内部类
- MyEclipse使用经验归纳
- Spring4 AOP详解
- java web简单权限管理设计
- Netbeans8下 Weblogic EJB案例
- java Servlet接口及应用(转)
- Java学习笔记(字符串)
- java通过JDBC连接mysql数据库
- Mac_开发工具_IntelliJ IDEA如何创建Java SE项目
- 第二章 Java语言基础(1)
- Spring的核心技术(五)---基于构造器的依赖注入
- Java异常信息处理
- spring boot + velocity中文乱码解决方式
- 走进Java(六)静态代理和动态代理
- 使用NIO实现非阻塞Socket通信原理