使用enum关键字创建枚举类

本文介绍了如何使用 enum 关键字创建枚举类型,讲解了枚举类的属性和方法。枚举类的属性应使用 private final 修饰并在构造器中赋值。枚举类型符合 Class Enum<E extends Enum<E>> 模式,每个值通过 Enum 构造函数映射。枚举类在编译后会生成继承自 java.lang.Enum 的类。此外,枚举类可以实现接口,根据需求选择统一实现或为每个枚举值单独实现接口方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

使用enum关键字创建枚举类型,隐含了所创建的类型都是 java.lang.Enum(抽象类) 类的子类。

枚举类的属性:

枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰。

1)枚举类的使用 private final 修饰的属性应该在构造器中为其赋值。

2)若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数。

               

枚举类的主要方法:

values()方法返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
valueOf(String str)可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常。
getDeclaringClass()返回与此枚举常量的枚举类型相对应的 Class 对象。
name()返回此枚举常量的名称,在其枚举声明中对其进行声明。
ordinal()返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
toString()返回枚举常量的名称,它包含在声明中。

原理分析:

枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。

public enum EnumTest {
    MON, TUE, WED, THU, FRI, SAT, SUN;
}

这段代码实际上调用了7次 Enum(String name, int ordinal):

new Enum<EnumTest>("MON",0);
new Enum<EnumTest>("TUE",1);
new Enum<EnumTest>("WED",2);
    ... ...

遍历、switch 等常用操作

for (EnumTest e : EnumTest.values()) {
    System.out.println(e.toString());
}

EnumTest test = EnumTest.TUE;

switch (test) {
    case MON:
        System.out.println("星期一");
        break;
    case TUE:
        System.out.println("星期二");
        break;
    // ... ...
    default:
        System.out.println(test);
        break;
}

enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum<E>。EnumTest 经过反编译(javap com.test.EnumTest 命令)之后得到的内容如下:

public class com.test.EnumTest extends java.lang.Enum{
    public static final com.test.EnumTest MON;
    public static final com.test.EnumTest TUE;
    public static final com.test.EnumTest WED;
    public static final com.test.EnumTest THU;
    public static final com.test.EnumTest FRI;
    public static final com.test.EnumTest SAT;
    public static final com.test.EnumTest SUN;

    static {};

    public int getValue();
    public boolean isRest();
    public static com.test.EnumTest[] values();
    public static com.test.EnumTest valueOf(java.lang.String);

    com.test.EnumTest(java.lang.String, int, int, com.test.EnumTest);
}

所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。另外,enum 不能使用 extends 关键字继承其他类,因为enum已经继承了 java.lang.Enum(java只支持单一继承)。

创建枚举类:

和普通 Java 类一样,枚举类可以实现一个或多个接口。若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式,则可以让每个枚举值分别来实现该方法。

public class Seasons {
    public static void main(String[] args) {
        Season1 spring = Season1.SPRING;
        System.out.println(spring);// 默认调用spring.toString()方法
        System.out.println(spring.getSeasonName());
        spring.show();
        //使用values()方法可以返回整个枚举类的对象
        Season1[] seasons = Season1.values();
        for(Season1 s : seasons){
              System.out.println(s);
        }
        //使用valueOf(String str)
        String str = "SPRING";
        Season1 season = Season1.valueOf(str);
        System.out.println(season);
    }
}

interface Info{
    void show();  
}

enum Season1 implements Info {
    SPRING("SPRING", "春天") {
        public void show() {
            System.out.println("春暖花开");
        }
    },
    SUMMER("SUMMER", "夏天") {
        public void show() {
            System.out.println("夏日炎炎");
        }
    },
    AUTUMN("AUTUMN", "秋天") {
        public void show() {
            System.out.println("秋高气爽");
        }
    },
    WINTER("WINTER", "冬天") {
        public void show() {
            System.out.println("白雪皑皑");
        }
    };

    // 1.提供类的属性,并声明为private final
    private final String seasonName;
    private final String seasonDesc;

    // 2.将声明为private final的属性在私有化的构造器中初始化
    private Season1(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    // 3.通过公共的方法来调用私有属性
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

    @Override
    public String toString() {
        return "Season1 [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]";
    }

    public void show() {
        System.out.println("这是一个季节!");
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值