java中枚举的使用

 enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中。

 创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。

下面来定义一个枚举类型:

package test;
public enum Week {
     MOn,Tue,WED,THU,TRI,SAT,SUN;	
}
 遍历枚举类型的代码如下:
public class Test3  {
	public static void main(String[] args) {
		for(Week w:Week.values()){
			System.out.println(w.);
		}
	}
}

 enum 对象的常用方法介绍

int compareTo(E o)                    比较此枚举与指定对象的顺序。

Class<E> getDeclaringClass()   返回与此枚举常量的枚举类型相对应的 Class 对象。

String name()                             返回此枚举常量的名称,在其枚举声明中对其进行声明。

int ordinal()                                 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

String toString()                          返回枚举常量的名称,它包含在声明中。

static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 

                                                   返回带指定名称的指定枚举类型的枚举常量。

原理分析

        enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum<E>。EnumTest 经过反编译(javap com.hmw.test.EnumTest 命令)之后得到的内容如下:

public class test.Week extends java.lang.Enum{
    public static final test.Week MON;
    public static final test.Week TUE;
    public static final test.Week WED;
    public static final test.Week THU;
    public static final test.Week FRI;
    public static final test.Week SAT;
    public static final test.Week SUN;
    static {};
    public int getValue();
    public boolean isRest();
    public static test.Week[] values();
    public static test.Week valueOf(java.lang.String);
    test.Week(java.lang.String, int, int, test.Week);
}

 所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。

总结

    可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。

猜你喜欢

转载自1069843121.iteye.com/blog/2403987