文章目录
- 一、枚举的概念
-
- 1.枚举的概念
- 2.内部类中使用枚举
- 3.迭代枚举元素
- [4.在 switch 中使用枚举类](#4.在 switch 中使用枚举类)
- [5.values(), ordinal() 和 valueOf() 方法](#5.values(), ordinal() 和 valueOf() 方法)
- 6.枚举类成员
一、枚举的概念
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