1. 概述
枚举是一种特殊的数据类型,它列出了一组预定义的常量,并使用标识符来引用这些常量。枚举的用途很广泛,下面列举了几个常见的应用场景:
管理常量:如果您需要在程序中使用一组固定不变的常量,建议使用枚举来管理这些常量。这样可以使得代码更加可读和易于维护。例如,你可以使用一个代表颜色的枚举,来管理程序中可能需要使用到的所有颜色。
替代布尔值:如果某个函数或方法的返回值只有两种状态,True 或者 False,可以使用枚举来管理只有两种状态的结果,使代码具有更好的可读性和易维护性。枚举可以将 True 和 False 映射到你实际希望表示的含义。
解析字符串:枚举常用于解析字符串并转换为相应的枚举值。对于从外部系统或文件读取的值,而我们必须将它们转换为特定的枚举值,将非常有用。
代替整数常量:在以前,程序员经常使用“幻数”(即硬编码的数字)。现在推荐使用枚举来代替整数常量或“幻数”,这样可以使代码更加可读和易于维护。
2. 定义格式
- 格式
public enum s { 枚举项1,枚举项2,枚举项3; } 注意: 定义枚举类要用关键字enum
示例代码
// 定义一个枚举类,用来表示春,夏,秋,冬这四个固定值 public enum Season { SPRING,SUMMER,AUTUMN,WINTER; }
3. 枚举的特点
特点
- 所有枚举类都是Enum的子类
- 我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项
- 每一个枚举项其实就是该枚举的一个对象
- 枚举也是一个类,也可以去定义成员变量
- 枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略
- 枚举类可以有构造器,但必须是private的,它默认的也是private的。
枚举项的用法比较特殊:枚举(“”);
- 枚举类也可以有抽象方法,但是枚举项必须重写该方法示例代码
public enum Season { SPRING("春"){ //如果枚举类中有抽象方法 //那么在枚举项中必须要全部重写 @Override public void show() { System.out.println(this.name); } }, SUMMER("夏"){ @Override public void show() { System.out.println(this.name); } }, AUTUMN("秋"){ @Override public void show() { System.out.println(this.name); } }, WINTER("冬"){ @Override public void show() { System.out.println(this.name); } }; public String name; //空参构造 //private Season(){} //有参构造 private Season(String name){ this.name = name; } //抽象方法 public abstract void show(); }
public class EnumDemo { public static void main(String[] args) { /* 1.所有枚举类都是Enum的子类 2.我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项 3.每一个枚举项其实就是该枚举的一个对象 4.枚举也是一个类,也可以去定义成员变量 5.枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的, 但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略 6.枚举类可以有构造器,但必须是private的,它默认的也是private的。 枚举项的用法比较特殊:枚举(""); 7.枚举类也可以有抽象方法,但是枚举项必须重写该方法 */ //第二个特点的演示 //我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项 System.out.println(Season.SPRING); System.out.println(Season.SUMMER); System.out.println(Season.AUTUMN); System.out.println(Season.WINTER); //第三个特点的演示 //每一个枚举项其实就是该枚举的一个对象 Season spring = Season.SPRING; } }
4. 枚举的方法
- 方法介绍
- 示例代码
public enum Season { SPRING,SUMMER,AUTUMN,WINTER; } public class EnumDemo { public static void main(String[] args) { // String name() 获取枚举项的名称 String name = Season.SPRING.name(); System.out.println(name); System.out.println("-----------------------------"); // int ordinal() 返回枚举项在枚举类中的索引值 int index1 = Season.SPRING.ordinal(); int index2 = Season.SUMMER.ordinal(); int index3 = Season.AUTUMN.ordinal(); int index4 = Season.WINTER.ordinal(); System.out.println(index1); System.out.println(index2); System.out.println(index3); System.out.println(index4); System.out.println("-----------------------------"); // int compareTo(E o) 比较两个枚举项,返回的是索引值的差值 int result = Season.SPRING.compareTo(Season.WINTER); System.out.println(result);//-3 System.out.println("-----------------------------"); // String toString() 返回枚举常量的名称 String s = Season.SPRING.toString(); System.out.println(s); System.out.println("-----------------------------"); // static <T> T valueOf(Class<T> type,String name) // 获取指定枚举类中的指定名称的枚举值 Season spring = Enum.valueOf(Season.class, "SPRING"); System.out.println(spring); System.out.println(Season.SPRING == spring); System.out.println("-----------------------------"); // values() 获得所有的枚举项 Season[] values = Season.values(); for (Season value : values) { System.out.println(value); } } }