Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一年的 12 个月份,一个星期的 7 天,方向有东南西北等。
Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割
例如定义一个颜色的枚举类
以上枚举类 Color 颜色常量有 RED, GREEN, BLUE,分别表示红色,绿色,蓝色
enum Color
{
RED, GREEN, BLUE;
}
enum Color
{
RED, GREEN, BLUE;
}
public class Test
{
// 执行输出结果
public static void main(String[] args)
{
Color c1 = Color.RED;
System.out.println(c1);
}
}
内部类中使用枚举
public class Test
{
enum Color
{
RED, GREEN, BLUE;
}
// 执行输出结果
public static void main(String[] args)
{
Color c1 = Color.RED;
System.out.println(c1);
}
}
每个枚举都是通过 Class 在内部实现的,且所有的枚举值都是 public static final 的
class Color
{
public static final Color RED = new Color();
public static final Color BLUE = new Color();
public static final Color GREEN = new Color();
}
迭代枚举元素
可以使用 for 语句来迭代枚举元素
enum Color
{
RED, GREEN, BLUE;
}
public class MyClass {
public static void main(String[] args) {
for (Color myVar : Color.values()) {
System.out.println(myVar);
}
}
}
在 switch 中使用枚举类
枚举类常应用于 switch 语句中
enum Color
{
RED, GREEN, BLUE;
}
public class MyClass {
public static void main(String[] args) {
Color myVar = Color.BLUE;switch(myVar) {
case RED:
System.out.println("红色");
break;
case GREEN:
System.out.println("绿色");
break;
case BLUE:
System.out.println("蓝色");
break;
}
}
}
常用方法
values(), ordinal() 和 valueOf() 方法
enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Serializable 和 java.lang.Comparable 两个接口。
values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:
- values() 返回枚举类中所有的值。
- ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
- valueOf()方法返回指定字符串值的枚举常量
enum Color
{
RED, GREEN, BLUE;
}
public class Test
{
public static void main(String[] args)
{
// 调用 values()
Color[] arr = Color.values();
// 迭代枚举
for (Color col : arr)
{
// 查看索引
System.out.println(col + " at index " + col.ordinal());
}
// 使用 valueOf() 返回枚举常量,不存在的会报错 IllegalArgumentException
System.out.println(Color.valueOf("RED"));
// System.out.println(Color.valueOf("WHITE"));
}
}
定义枚举类
1.`枚举类的构造器只能使用 private 权限修饰符`
2.`枚举类的所有实例必须在枚举类中显式列出 (,分隔 ;结尾 )。列出的实例系统会自动添加 public static final 修饰`
3.必须在枚举类的第一行声明枚举类对象
4.使用 enum 定义的枚举类默认继承了 java.lang.Enum 类,因此不能再继承其他类
// 使用 enum 关键字枚举类
enum Season1 {
// 1. 提供当前枚举类的对象,多个对象之间用 "," 隔开,末尾对象 ";" 结束
SPRING(" 春 天 ", " 万物复苏 "),
SUMMER(" 夏 天 ", " 烈日炎炎 "),
AUTUMN(" 秋天 ", " 金秋送爽 "),
WINTER(" 冬天 ", " 白雪皑皑 ");
// 2. 声明 Season 对象的属性: private final 修饰
private final String seasonName;
private final String seasonDesc;
// 3. 私有化类的构造器 , 并给对象属性赋值
private Season1(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
// 4. 其他诉求:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
}
public class SeasonTest1 {
public static void main(String[] args) {
Season1 summer = Season1.SUMMER;
System.out.println(summer.toString());
System.out.println(Season1.class.getSuperclass()); //获取当前类的父类
}
}
实例
package Enum;
/**
* @Description:switch中使用枚举
*/
public enum OpCodeEnum {
ADD("加"), SUB("减"),MUL("乘"), DIV("除"),INC("自增"), DEC("自减"),LT("小于"),
GT("大于"),EQ("等于"),ISZERO("是否为0"),NULL("null"), NOT("不等于"),RETURN("返回"),
MOD("取余"),AND("并且"), OR("或者");private String msg;
OpCodeEnum(String msg) {
this.msg = msg;
}/*
* 匹配操作码
* */
public static OpCodeEnum matchOpCode(String opCodeStr) {
for (OpCodeEnum opCode : OpCodeEnum.values()) {
if (opCode.name().equalsIgnoreCase(opCodeStr)) {
return opCode;
}
}
return OpCodeEnum.NULL;
}public static void main(String[] args) {
//switch中使用枚举
String opStr = "add";
switch (OpCodeEnum.matchOpCode(opStr)) {
case ADD:
System.out.println("加法");
break;
case SUB:
System.out.println("减法");
break;
case MUL:
System.out.println("乘法");
break;
case DIV:
System.out.println("除法");
break;
}
}
}