学习资源:拉勾教育
枚举的基本概念
- 在日常生活中这些事物的取值只有明确的几个固定值,此时描述这些事物的所有值都可以一一列举出来,而这个列举出来的类型就叫做
枚举类型
。
枚举的定义
- 使用
public static final
表示的常量描述较为繁琐,使用enum
关键字来定义枚举类型取代常量,枚举类型是从Java5开始增加的一种引用数据类型。 - 枚举值就是当前类的类型,也就是指向本类的对象,默认使用
public static final
关键字共同修饰,因此采用枚举类型.的方式调用。 - 枚举类可以自定义构造方法,但是构造方法的修饰符必须是
private
,默认也是私有的。
Enum类的概念和方法
所有的枚举类都继承自java.lang.Enum
类,常用方法如下:
方法 | 描述 |
---|---|
static T[] values() | 返回当前枚举类中的所有对象 |
String toString() | 返回当前枚举类对象的名称 |
int ordinal() | 获取枚举对象在枚举类中的索引位置 |
static T valueOf(String str) | 将参数指定的字符串名转为当前枚举类的对象 |
int compareTo(E o) | 比较两个枚举对象在定义时的顺序 |
枚举类实现接口的方式
- 枚举类实现接口后需要重写抽象方法,而重写方法的方式有两种:重写一个,或者每个对象都重写。
代码
/**
* 编程实现所有方向的枚举,所有的方向:上、下、左、右
*/
public class Direction {
private final String desc; // 用于描述方向字符串的成员变量
// 2.申明本类类型的引用指向本类类型的对象
public static final Direction UP = new Direction("向上");
public static final Direction DOWN = new Direction("向下");
public static final Direction LEFT = new Direction("向左");
public static final Direction RIGHT = new Direction("向右");
// 通过构造方法实现成员变量的初始化,更加灵活
// 1.私有化构造方法,此时该构造方法只能在本类中使用
private Direction(String desc) {
this.desc = desc;
}
// 提供公有的get方法可以再本类的外部访问该类的成员变量的数值
public String getDesc() {
return desc;
}
}
public interface DirectionInterface {
// 自定义抽象方法
public abstract void show();
}
/**
* 编程实现所有方向的枚举,所有的方向:上、下、左、右
* 枚举类型要求所有枚举值必须放在枚举类型的前面
*/
public enum DirectionEnum implements DirectionInterface{
// 2.申明本类类型的引用指向本类类型的对象
// 匿名内部类的语法格式:接口/父类类型 引用变量名 = new 接口/父类类型(){ 方法的重写 };
// public static final Direction UP = new Direction("向上"){ 方法的重写 };
UP("向上"){
@Override
public void show() {
System.out.println("向上移动了一下");
}
}, DOWN("向下") {
@Override
public void show() {
System.out.println("向下移动了一下");
}
}, LEFT("向左") {
@Override
public void show() {
System.out.println("向左移动了一下");
}
}, RIGHT("向右") {
@Override
public void show() {
System.out.println("向右移动了一下");
}
};
private final String desc; // 用于描述方向字符串的成员变量
// 通过构造方法实现成员变量的初始化,更加灵活
// 1.私有化构造方法,此时该构造方法只能在本类中使用
private DirectionEnum(String desc) {
this.desc = desc;
}
// 提供公有的get方法可以再本类的外部访问该类的成员变量的数值
public String getDesc() {
return desc;
}
// 整个枚举类型只重写一次,所有对象调用同一个
/*@Override
public void show() {
System.out.println("现在可以实现接口中抽象方法的重写了!");
}*/
}
public class DirectionTest {
public static void main(String[] args) {
Direction d1 = Direction.UP;
System.out.println("获取到的方向是:" + d1.getDesc()); // 向上
System.out.println("---------------------------");
// 使用Java5开始的枚举类型
DirectionEnum de = DirectionEnum.DOWN;
System.out.println("获取到的方向是:" + de.getDesc()); // 向下
}
}
public class DirectionUseTest {
// 自定义静态方法实现根据参数指定的字符串内容来打印具体的方向信息
public static void test1(String str) {
switch (str) {
case "向上":
System.out.println("上上上");break;
case "向下":
System.out.println("下下下");break;
case "向左":
System.out.println("左左左");break;
case "向右":
System.out.println("右右右");break;
default:
System.out.println("没有这样的方向!");
}
}
// 自定义静态方法实现根据参数指定的枚举类型来打印具体的方向信息
public static void test2(DirectionEnum de) {
switch (de) {
case UP:
System.out.println("上上上");break;
case DOWN:
System.out.println("下下下");break;
case LEFT:
System.out.println("左左左");break;
case RIGHT:
System.out.println("右右右");break;
default:
System.out.println("没有这样的方向!");
}
}
public static void main(String[] args) {
DirectionUseTest.test1(Direction.UP.getDesc());
System.out.println("-----------------------");
DirectionUseTest.test2(DirectionEnum.DOWN);
}
}
/**
* 编程实现方向枚举类的测试
*/
public class DirectionEnumTest{
public static void main(String[] args) {
// 1.获取DirectionEnum类型中所有的枚举对象
DirectionEnum[] arr = DirectionEnum.values();
// 2.打印每个枚举对象在枚举类型中的名称和索引位置
for(int i = 0 ; i < arr.length ; i++) {
System.out.print("获取到的枚举对象对应的索引位置是:" + arr[i].ordinal()); // 和数组一样下标从0开始
System.out.println(",获取到的枚举对象名称是:" + arr[i].toString());
}
System.out.println("-------------------------------------");
// 3.根据参数指定的字符串得到枚举类型的对象,也就是将字符串转换为对象
//DirectionEnum de = DirectionEnum.valueOf("向左"); // 编译OK,运行时发生IllegalArgumentException非法参数异常
DirectionEnum de = DirectionEnum.valueOf("LEFT");
//System.out.println("转换出来的枚举对象名称是:" + de.toString());
System.out.println("转换出来的枚举对象名称是:" + de); // 打印引用变量时,会自动调用toString()方法
System.out.println("-------------------------------------");
// 4.使用获取到的枚举对象与枚举类中已有的对象比较先后顺序
for(int i = 0 ; i < arr.length ; i++) {
// 当调用对象在参数对象之后时,获取到的比较结果为正数;之前则为负数;相同则为0
System.out.println("调用对象与数组中对象比较的先后顺序为:" + de.compareTo(arr[i]));
}
System.out.println("-------------------------------------");
// 5.使用数组中每个DirectionEnum对象都去调用show方法
for(int i = 0 ; i < arr.length ; i++) {
arr[i].show();
}
}
}