【Java基础】24.枚举

文章目录


一、枚举的概念

1.枚举的概念

Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一年的 12 个月份,一个星期的 7 天,方向有东南西北等。

Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。

例如定义一个季节的枚举类:

java 复制代码
/**
 * @ClassName: Season
 * @Description: 枚举(enum)
 * @author: Zh
 * @date: 2024/4/21 10:43
 */
// 枚举类使用 enum 关键字来定义
public enum Season {
    // 枚举的第一行必须罗列枚举类的对象名称,建议全部大写。
    SPRING, SUMMER, AUTUMN, WINTER; // 春天,夏天,秋天,冬天
}

以上枚举类 Season 颜色常量有 SPRING, SUMMER, AUTUMN, WINTER,分别表示春天,夏天,秋天,冬天。

使用实例:

java 复制代码
public class Test {
    public static void main(String[] args) {
        Season s1 = Season.SPRING;
        System.out.println("现在的季节是:" + s1);
    }
}

输出结果为:

java 复制代码
现在的季节是:SPRING

2.内部类中使用枚举

枚举类也可以声明在内部类中:

java 复制代码
public class Test {
    enum Week{
        MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY
    }

    public static void main(String[] args) {
        Week w1 = Week.SUNDAY;
        System.out.println("今天是周几:" + w1);
    }
}

输出结果为:

java 复制代码
今天是周几:SUNDAY

每个枚举都是通过 Class 在内部实现的,且所有的枚举值都是 public static final 的。

3.迭代枚举元素

可以使用 for 语句来迭代枚举元素:

java 复制代码
public class Test {
    enum Week{
        MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY
    }

    public static void main(String[] args) {
        // 迭代枚举元素
        for (Week myVar : Week.values()) {
            System.out.println(myVar);
        }

    }
}

输出结果为:

java 复制代码
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

4.在 switch 中使用枚举类

枚举类常应用于 switch 语句中:

java 复制代码
public class Test {
    enum Week{
        MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY
    }

    public static void main(String[] args) {
        Week w1 = Week.SUNDAY;

        // 在 switch 中使用枚举类
        switch (w1) {
            case MONDAY:
                System.out.println("今天周一,埋头苦干,解决bug ");
                break;
            case TUESDAY:
                System.out.println("今天周二,请求大牛程序员帮忙");
                break;
            case WEDNESDAY:
                System.out.println("今天周三,今晚啤酒、龙虾、小烧烤");
                break;
            case THURSDAY:
                System.out.println("今天周四,主动帮助新来的女程序解决bug");
                break;
            case FRIDAY:
                System.out.println("今天周五,今晚吃鸡");
                break;
            case SATURDAY:
                System.out.println("今天周六,与王婆介绍的小芳相亲");
                break;
            case SUNDAY:
                System.out.println("今天周日,郁郁寡欢、准备上班");
                break;
            default:
                System.out.println("数据有误!");
        }

    }
}

输出结果为:

java 复制代码
今天周日,郁郁寡欢、准备上班

5.values(), ordinal() 和 valueOf() 方法

enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Serializable 和 java.lang.Comparable 两个接口。

values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:

  • values() 返回枚举类中所有的值。
  • ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
  • valueOf()方法返回指定字符串值的枚举常量。

实例:

java 复制代码
/**
 * @ClassName: EnumDemo
 * @Description: 枚举,values(), ordinal() 和 valueOf() 方法
 * @author: Zh
 * @date: 2024/4/21 12:32
 */
public class EnumDemo {
    enum Month {
        JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE,
        JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER;
    }

    public static void main(String[] args) {
        // 调用 values()
        Month[] arr = Month.values();

        // 迭代枚举
        for (Month mon : arr) {
            // 查看索引
            System.out.println(mon + "的索引:" + mon.ordinal());
        }

        // 使用 valueOf() 返回枚举常量
        System.out.println(Month.valueOf("JANUARY"));
        // 不存在的会报错 IllegalArgumentException
        // System.out.println(Color.valueOf("WHITE"));
    }
}

运行结果如下:

java 复制代码
JANUARY的索引:0
FEBRUARY的索引:1
MARCH的索引:2
APRIL的索引:3
MAY的索引:4
JUNE的索引:5
JULY的索引:6
AUGUST的索引:7
SEPTEMBER的索引:8
OCTOBER的索引:9
NOVEMBER的索引:10
DECEMBER的索引:11
JANUARY

6.枚举类成员

枚举跟普通类一样可以用自己的变量、方法和构造函数,构造函数只能使用 private 访问修饰符,所以外部无法调用。

枚举既可以包含具体方法,也可以包含抽象方法。 如果枚举类具有抽象方法,则枚举类的每个实例都必须实现它。

实例:

java 复制代码
/**
 * @ClassName: Test2
 * @Description: 枚举类成员
 * 枚举跟普通类一样可以用自己的变量、方法和构造函数。
 * 构造函数只能使用 private 访问修饰符,所以外部无法调用。
 * 枚举既可以包含具体方法,也可以包含抽象方法。
 * 如果枚举类具有抽象方法,则枚举类的每个实例都必须实现它。
 * @author: Zh
 * @date: 2024/4/21 12:44
 */
public class Test2 {
    // 输出
    public static void main(String[] args) {
        Color c1 = Color.RED;
        System.out.println("c1:" + c1);
        c1.colorInfo();
    }

    enum Color {
        RED, GREEN, BLUE;

        // 构造函数
        private Color() {
            System.out.println("Constructor called for : " + this.toString());
        }

        public void colorInfo() {
            System.out.println("Universal Color");
        }
    }

}

运行结果如下:

java 复制代码
Constructor called for : RED
Constructor called for : GREEN
Constructor called for : BLUE
c1:RED
Universal Color
相关推荐
哎呦没22 分钟前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
Kalika0-039 分钟前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
_.Switch41 分钟前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
编程、小哥哥1 小时前
netty之Netty与SpringBoot整合
java·spring boot·spring
代码雕刻家1 小时前
课设实验-数据结构-单链表-文教文化用品品牌
c语言·开发语言·数据结构
一个闪现必杀技1 小时前
Python入门--函数
开发语言·python·青少年编程·pycharm
Fan_web1 小时前
jQuery——事件委托
开发语言·前端·javascript·css·jquery
龙图:会赢的1 小时前
[C语言]--编译和链接
c语言·开发语言
IT学长编程2 小时前
计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·玩具租赁系统
莹雨潇潇2 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器