【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
相关推荐
杨运交8 分钟前
[071][验证码模块]基于Spring拦截器的验证码认证设计思想
java·后端·spring
Geek-Chow24 分钟前
CountDownLatch in Java
java
SL_staff1 小时前
从RBAC到场景化授权:《无忧·企业文档》三级权限模型的技术实践解析
java·开源·产品
传奇开心果编程2 小时前
【springboot基础语法学与练】第 1 课:从零开始
java·spring boot·后端·学习
SL_staff2 小时前
财务系统慎用低代码?从数据模型闭环看合规落地的技术实践
java·低代码·全栈
Bruce_Liuxiaowei2 小时前
Python 实例赋值遮蔽类属性:一个从不报错的静默陷阱
开发语言·python·语法糖
滕州市燕猫虎计算机科技工作室个体工商户2 小时前
IDEA:Command line is too long
java·ide·intellij-idea
步行cgn2 小时前
Spring p 命名空间注入详解
java·前端·spring
YatHinLay2 小时前
MyBatis 流式查询实战:ResultHandler 处理海量数据
java
天天被压力3 小时前
【跨市场数据实战 #08】可转债折价机会怎么筛:3个接口抓比价、列表和实时盘口
java·人工智能·python