枚举

枚举

一组被命名的整数集合,用于声明一组带标识符的常数。

eg,性别、一周的星期几

声明枚举

public enum enumname:基础数据类型{
	enum-body;
}

任意两个枚举成员不能具有相同的名称,且它的常数值必须在该枚举的基础类型的范围之内,多个枚举成员之间使用逗号分隔。

提示:如果没有显式地声明基础类型的枚举,那么意味着它所对应的基础类型是 int。

例1:

public enum SexEnum {
    female,male;
}
public enum Color {
    blue,yellow,RED,BLACK;
}

之后便可以通过枚举类型名直接引用常量,如 SexEnum.male、Color.RED。

使用switch

enum Signal{
    GREEN,RED,YELLOW;
}

public class TrafficLight{
    Signal color = Signal.RED;
    public void change(){
        switch(color){
            case RED:
                color = Signal.GREEN;
                break;
            case GREEN:
                color = Signal.YELLOW;
                break;
            case YELLOW:
                color = Signal.RED;
                break;
        }
    }
}

上面的通常的使用!接下来好戏才开始。

枚举的定义

我们使用了enum关键字,实际上,里面隐含了所创建的类型都是java.lang.Enum的子类,(java.lang.Enum是一个Abstract类)

枚举类型符合通用模式Class Enum<E extends Enum>, E 表示枚举类型的名称。

枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。

package com.hmw.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 对象的常用方法介绍

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)
返回带指定名称的指定枚举类型的枚举常量。

package EnumDemo;

public class Demo2 {

    public static void main(String[] args) {

        DayOfTheWeek day = DayOfTheWeek.THURSDAY;
//        o1.compareTo(E o)
//        返回o1-o的值(o1,和o所在索引之差)
        System.out.println(day.compareTo(DayOfTheWeek.FRIDAY));
        if (day.compareTo(DayOfTheWeek.FRIDAY) > 0) {
            System.out.println("在星期五之后");
        } else if (day.compareTo(DayOfTheWeek.FRIDAY) < 0) {
            System.out.println("在星期五之前");
        } else {
            System.out.println("恰好是星期五");
        }
        
        System.out.println("getDeclare" + day.getDeclaringClass());
        System.out.println(day.getDeclaringClass().getName());

        System.out.println(day.name());

        System.out.println(day.ordinal());
        
		System.out.println(DayOfTheWeek.valueOf(DayOfTheWeek.class,"FRIDAY"));
    }
}

image-20210408162751403

给 enum 自定义属性和方法

给 enum 对象加一下 value 的属性和 getValue() 的方法:

也就是说,enum里面的数据,都自动添加一个value,类似ArrayList。

总结

可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。

posted @ 2021-04-14 16:13  大D同学  阅读(103)  评论(0)    收藏  举报