《五》枚举
【一】枚举
枚举是一个被命名的整型常量的聚合,用于声明一组带标识符的常量。
1.使用枚举类型设置常量
以往设置常量,通常将常量放置在接口中,这样在程序中就可以直接使用,并且该常量不能被修改,因为在接口中定义常量时,该常量的修饰符为final与static。
新增枚举类型后就逐渐取代了这种常量的定义方式,因为通过使用枚举类型,可以赋予程序在编译时进行检查的功能。使用枚举类型定义常量的语法如下:
public enum Const{ const_A, const_B, const_C }
1.1 比较常量和枚举的不同之处:
interface Const { // 将常量放置在接口中 public static final int Const_A = 1; public static final int Const_B = 2; } public class ConstTest { enum Const2 { // 将常量放置在枚举类型中 Const_A, Const_B } // 使用接口定义常量 public static void doit(int c) { // 定义一个方法,这里的参数为int型 switch (c) { // 根据常量的值做不同操作 case Const.Const_A: System.out.println("doit() Const_A"); break; case Const.Const_B: System.out.println("doit() Const_B"); break; } } public static void doit2(Const2 c) { // 定义一个参数对象是枚举类型的方法 switch (c) { // 根据枚举类型对象做不同操作 case Const_A: System.out.println("doit2() Const_A"); break; case Const_B: System.out.println("doit2() Const_B"); break; } } public static void main(String[] args) { ConstTest.doit(Const.Const_A); // 使用接口中定义的常量,结果为:doit() Const_A ConstTest.doit2(Const2.Const_A); // 使用枚举类型中的常量,结果为:doit2() Const_A ConstTest.doit2(Const2.Const_B); // 使用枚举类型中的常量,结果为:doit2() Const_B ConstTest.doit(3);//使用int类型,结果为:doit() Const_A ConstTest.doit2(3);//报错 } }
在上述代码中,当用户调用doit()方法时,使编译器不接受在接口中定义的常量参数,也不会报错;但调用doit2()方法,任意传递参数,编译器就会报错,因为这个方法只接受枚举类型的常量作为其参数。
枚举类型可以在类的内部进行定义,也可以在类的外部定义,如果在类的内部定义,则类似于内部类形式。
2.深入了解枚举类型
2.1操作枚举类型成员的方法
Java 中的每一个枚举都继承自 java.lang.Enum 类。当定义一个枚举类型时,每一个枚举类型成员都可以看作是 Enum 类的实例,这些枚举成员默认都被 final、public, static 修饰,当使用枚举类型成员时,直接使用枚举名称调用成员即可。
注意:
- 枚举类不能继承其他类,因为在编译时它已经继承了 java.lang.Enum 类,java无法多继承
- 使用enum定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类
- 枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰
- 枚举表示的类型其取值是必须有限的
所有枚举实例都可以调用 Enum 类的方法,常用方法:
方法名称 | 具体含义 | 使用方法 |
values() | 该方法可以将枚举成员以数组的形式返回 | 枚举类型名称.values() |
valuesOf() | 该方法可以实现将普通字符串转化为枚举实例 | 枚举类型名称.values("abc") |
compareTo() | 该方法用于比较两个枚举对象在定义时的顺序 | 枚举对象.compareTo() |
ordinal() | 该方法用于得到枚举成员的位置索引 | 枚举对象.ordinal() |
经典实例:
public enum Day { MONDAY("星期一", 1), TUESDAY("星期二", 2), WEDNESDAY("星期三", 3), THURSDAY("星期四", 4), FRIDAY("星期五", 5), SATURDAY("星期六", 6), SUNDAY("星期天", 7);//这个分号不可省略哦 //先自定义两个自定义枚举的属性 //此枚举类中包含的枚举对象的文字描述 private String desc; //此枚举类中包含的枚举对象的对应的代码 private int code; public String getDesc() { return desc; } public int getCode() { return code; } //通过自定义的code属性,来获取整个枚举对象,静态方法 public static Day getDayByCode(int code) { Day day = null; switch (code) { case 1: day = Day.MONDAY; break; case 2: day = Day.TUESDAY; break; case 3: day = Day.WEDNESDAY; break; case 4: day = Day.THURSDAY; break; case 5: day = Day.FRIDAY; break; case 6: day = Day.SATURDAY; break; case 7: day = Day.SUNDAY; break; } return day; } //此枚举类自定义一个构造器 private Day(String desc, int code) { this.desc = desc; this.code = code; } }
public class DayDemo { public static void main(String[] args) { Day[] days = Day.values(); //遍历枚举 // for(Day day:days){ // System.out.println(day.toString()); // } Day monday = Day.valueOf("MONDAY");//将普通字符串转化为枚举实例,返回的是monday对象 Day sunday = Day.SUNDAY;//通过枚举类名直接使用 //枚举的父类定义了一个odinal(),作用是取出枚举对象的索引值 System.out.println(monday.ordinal());//0 System.out.println(sunday.ordinal());//6 //还有一个compareTo()方法,该方法用于比较两个枚举对象在定义时的顺序 System.out.println(monday.compareTo(monday));//顺序一样时等于0 System.out.println(monday.compareTo(sunday));//返回sunday索引-monday索引:-6 //这3种方法结果一样,输出枚举的文字描述 System.out.println(monday.name()); System.out.println(monday.toString()); System.out.println(monday); } }