您的位置:首页 > 编程语言 > Java开发

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()静态方法:返回一个包含全部枚举值的数组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: