【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
相关推荐
谈谈叭2 小时前
Javascript中的深浅拷贝以及实现方法
开发语言·javascript·ecmascript
lx学习2 小时前
Python学习26天
开发语言·python·学习
代码调试2 小时前
Springboot校园失物招领平台
java·spring boot
大今野3 小时前
python习题练习
开发语言·python
爱编程的鱼3 小时前
javascript用来干嘛的?赋予网站灵魂的语言
开发语言·javascript·ecmascript
camellias_3 小时前
SpringBoot(二十三)SpringBoot集成JWT
java·spring boot·后端
tebukaopu1483 小时前
springboot如何获取控制层get和Post入参
java·spring boot·后端
昔我往昔3 小时前
SpringBoot 创建对象常见的几种方式
java·spring boot·后端
q567315233 小时前
用 PHP或Python加密字符串,用iOS解密
java·python·ios·缓存·php·命令模式
灭掉c与java3 小时前
第三章springboot数据访问
java·spring boot·后端