1. 枚举的定义
1.1. 使用public static final表示的常量描述较为繁琐,使用enum关键字来定 义枚举类型取代常量,枚举类型是从Java5开始增加的一种引用数据类型。
1.2. 枚举值就是当前类的类型,也就是指向本类的对象,默认使用public static final关键字共同修饰,因此采用枚举类型.的方式调用。
1.3. 枚举类可以自定义构造方法,但是构造方法的修饰符必须是private,默 认也是私有的。
2. Enum类的概念和方法
2.1. 所有的枚举类都继承自java.lang.Enum类,常用方法如下:
static T[] values() |
返回当前枚举类中的所有对象
|
String toString() |
返回当前枚举类对象的名称
|
int ordinal() |
获取枚举对象在枚举类中的索引位置
|
static T valueOf(String str) |
将参数指定的字符串名转为当前枚举类的对象
|
int compareTo(E o) |
比较两个枚举对象在定义时的顺序
|
3. 枚举类实现接口的方式
枚举类实现接口后需要重写抽象方法,而重写方法的方式有两种:重写 一个,或者每个对象都重写。
1 package com.lagou.task10; 2 3 public interface DirectionInterface { 4 // 自定义抽象方法 5 public abstract void show(); 6 }
1 package com.lagou.task10; 2 3 /** 4 * 编程实现所有方向的枚举,所有的方向:向上、向下、向左、向右 枚举类型要求所有枚举值必须放在枚举类型的最前面 5 */ 6 public enum DirectionEnum implements DirectionInterface { 7 // 2.声明本类类型的引用指向本类类型的对象 8 // 匿名内部类的语法格式:接口/父类类型 引用变量名 = new 接口/父类类型() { 方法的重写 }; 9 // public static final Direction UP = new Direction("向上") { 方法的重写 }; 10 UP("向上") { 11 @Override 12 public void show() { 13 System.out.println("贪吃蛇向上移动了一下!"); 14 } 15 }, DOWN("向下") { 16 @Override 17 public void show() { 18 System.out.println("贪吃蛇向下移动了一下!"); 19 } 20 }, LEFT("向左") { 21 @Override 22 public void show() { 23 System.out.println("左移了一下!"); 24 } 25 }, RIGHT("向右") { 26 @Override 27 public void show() { 28 System.out.println("右移了一下!"); 29 } 30 }; 31 32 private final String desc; // 用于描述方向字符串的成员变量 33 34 // 通过构造方法实现成员变量的初始化,更加灵活 35 // 1.私有化构造方法,此时该构造方法只能在本类的内部使用 36 private DirectionEnum(String desc) { this.desc = desc; } 37 38 // 通过公有的get方法可以在本类的外部访问该类成员变量的数值 39 public String getDesc() { 40 return desc; 41 } 42 43 // 整个枚举类型只重写一次,所有对象调用同一个 44 /*@Override 45 public void show() { 46 System.out.println("现在可以实现接口中抽象方法的重写了!"); 47 }*/ 48 }
1 package com.lagou.task10; 2 3 /** 4 * 编程实现方向枚举类的测试,调用从Enum类中继承下来的方法 5 */ 6 public class DirectionEnumTest { 7 8 public static void main(String[] args) { 9 10 // 1.获取DirectionEnum类型中所有的枚举对象 11 DirectionEnum[] arr = DirectionEnum.values(); 12 // 2.打印每个枚举对象在枚举类型中的名称和索引位置 13 for (int i = 0; i < arr.length; i++) { 14 System.out.println("获取到的枚举对象名称是:" + arr[i].toString()); 15 System.out.println("获取到的枚举对象对应的索引位置是:" + arr[i].ordinal()); // 和数组一样下标从0开始 16 } 17 18 System.out.println("---------------------------------------------------------------"); 19 // 3.根据参数指定的字符串得到枚举类型的对象,也就是将字符串转换为对象 20 //DirectionEnum de = DirectionEnum.valueOf("向下"); // 编译ok,运行发生IllegalArgumentException非法参数异常 21 DirectionEnum de = DirectionEnum.valueOf("DOWN"); 22 //DirectionEnum de = DirectionEnum.valueOf("UP LEFT"); // 要求字符串名称必须在枚举对象中存在 23 //System.out.println("转换出来的枚举对象名称是:" + de.toString()); 24 System.out.println("转换出来的枚举对象名称是:" + de); // 当打印引用变量时,会自动调用toString方法 25 26 System.out.println("---------------------------------------------------------------"); 27 // 4.使用获取到的枚举对象与枚举类中已有的对象比较先后顺序 28 for(int i = 0; i < arr.length; i++) { 29 // 当调用对象在参数对象之后时,获取到的比较结果为 正数 30 // 当调用对象在参数对象相同位置时,则获取到的比较结果为 零 31 // 当调用对象在参数对象之前时,则获取到的比较结果为 负数 32 System.out.println("调用对象与数组中对象比较的先后顺序结果是:" + de.compareTo(arr[i])); 33 } 34 35 System.out.println("---------------------------------------------------------------"); 36 // 5.使用数组中每个DirectionEnum对象都去调用show方法测试 37 for (int i = 0; i < arr.length; i++) { 38 arr[i].show(); 39 } 40 } 41 }