Java枚举_动力节点Java学院整理
enum 的全称为 enumeration, 是 jdk 5 中引入的新特性,存放在 java.lang 包中。
原始的接口定义常量
public interface iconstants { string mon = "mon"; string tue = "tue"; string wed = "wed"; string thu = "thu"; string fri = "fri"; string sat = "sat"; string sun = "sun"; }
语法(定义)
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.enum 类的子类(java.lang.enum 是一个抽象类)。枚举类型符合通用模式class enum<e extends enum<e>>,而 e 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected enum(string name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
package com.bjpowernode.test; /** * 枚举测试类 */ public enum enumtest { mon, tue, wed, thu, fri, sat, sun; }
这段代码实际上调用了7次 enum(string name, int ordinal):
new enum<enumtest>("mon",0); new enum<enumtest>("tue",1); new enum<enumtest>("wed",2); ... ...
遍历、switch 等常用操作
对enum进行遍历和switch的操作示例代码:
public class test { public static void main(string[] args) { for (enumtest e : enumtest.values()) { system.out.println(e.tostring()); } system.out.println("----------------我是分隔线------------------"); enumtest test = enumtest.tue; switch (test) { case mon: system.out.println("今天是星期一"); break; case tue: system.out.println("今天是星期二"); break; // ... ... default: system.out.println(test); break; } } }
输出结果:
mon
tue
wed
thu
fri
sat
sun
----------------我是分隔线------------------
今天是星期二
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)
返回带指定名称的指定枚举类型的枚举常量。
public class test { public static void main(string[] args) { enumtest test = enumtest.tue; //compareto(e o) switch (test.compareto(enumtest.mon)) { case -1: system.out.println("tue 在 mon 之前"); break; case 1: system.out.println("tue 在 mon 之后"); break; default: system.out.println("tue 与 mon 在同一位置"); break; } //getdeclaringclass() system.out.println("getdeclaringclass(): " + test.getdeclaringclass().getname()); //name() 和 tostring() system.out.println("name(): " + test.name()); system.out.println("tostring(): " + test.tostring()); //ordinal(), 返回值是从 0 开始 system.out.println("ordinal(): " + test.ordinal()); } }
输出结果:
tue 在 mon 之后
getdeclaringclass(): com.hmw.test.enumtest name(): tue tostring(): tue ordinal(): 1
给 enum 自定义属性和方法
给 enum 对象加一下 value 的属性和 getvalue() 的方法:
package com.bjpowernode.test; /** * 枚举测试类 * */ public enum enumtest { mon(1), tue(2), wed(3), thu(4), fri(5), sat(6) { @override public boolean isrest() { return true; } }, sun(0) { @override public boolean isrest() { return true; } }; private int value; private enumtest(int value) { this.value = value; } public int getvalue() { return value; } public boolean isrest() { return false; } } public class test { public static void main(string[] args) { system.out.println("enumtest.fri 的 value = " + enumtest.fri.getvalue()); } }
输出结果:
enumtest.fri 的 value = 5 enumset,enummap 的应用 public class test { public static void main(string[] args) { // enumset的使用 enumset<enumtest> weekset = enumset.allof(enumtest.class); for (enumtest day : weekset) { system.out.println(day); } // enummap的使用 enummap<enumtest, string> weekmap = new enummap(enumtest.class); weekmap.put(enumtest.mon, "星期一"); weekmap.put(enumtest.tue, "星期二"); // ... ... for (iterator<entry<enumtest, string>> iter = weekmap.entryset().iterator(); iter.hasnext();) { entry<enumtest, string> entry = iter.next(); system.out.println(entry.getkey().name() + ":" + entry.getvalue()); } } }
原理分析
enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.enum<e>。enumtest 经过反编译(javap com.hmw.test.enumtest 命令)之后得到的内容如下:
public class com.hmw.test.enumtest extends java.lang.enum{ public static final com.hmw.test.enumtest mon; public static final com.hmw.test.enumtest tue; public static final com.hmw.test.enumtest wed; public static final com.hmw.test.enumtest thu; public static final com.hmw.test.enumtest fri; public static final com.hmw.test.enumtest sat; public static final com.hmw.test.enumtest sun; static {}; public int getvalue(); public boolean isrest(); public static com.hmw.test.enumtest[] values(); public static com.hmw.test.enumtest valueof(java.lang.string); com.hmw.test.enumtest(java.lang.string, int, int, com.hmw.test.enumtest); }
所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。
总结
可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.enum(java是单一继承)。
以上所述是小编给大家介绍的java枚举_动力节点java学院整理,希望对大家有所帮助