java枚举类型enum用法_java枚举类型enum用法和原理介绍【传智播客】

java枚举类型enum用法_java枚举类型enum用法和原理介绍【传智播客】Enum 枚举类型 Enum 的全写是 Enumeration 这个词的翻译是列举 逐条陈述 细目 在程序语言中 枚举类型是一种特殊的数据类型 常用的数据类型比如字符串 整型 这种数据类型的变量值限定在固定的范围 比如季节只有春夏秋冬 月份是 12 个 Java 中的枚举枚举前时代在 Java 语言中 枚举类型从 JDK1 5 才开始提供 在这之前使用接口静态常量来实现相关功能 也可以是类静态常量 以季节为例

Enum枚举类型

Enum的全写是Enumeration,这个词的翻译是列举、逐条陈述、细目。在程序语言中,枚举类型是一种特殊的数据类型(常用的数据类型比如字符串、整型),这种数据类型的变量值限定在固定的范围, 比如季节只有春夏秋冬,月份是12个。

Java中的枚举

枚举前时代

在Java语言中, 枚举类型从JDK1.5才开始提供。在这之前使用接口静态常量来实现相关功能(也可以是类静态常量),以季节为例:

在不使用枚举类之前,一般使用接口静态常量实现。比如:

public interface Season {

public static final int SPRING = 1;

public static final int SUMMER = 2;

public static final int AUTUMN = 3;

public static final int WINTER = 4;

}

使用JUnit使用测试如下:

@Test

public void noEnum() {

int i = 1;

Assert.assertTrue(Season.SPRING==i);

}

使用接口静态常量的方式比较难限定变量的范围,而且定义繁琐,功能也很有限,于是在Java 1.5 中定义了一个枚举类型:java.lang.Enum。

Java枚举的定义

类似类(class)和接口(interface)的定义,Java提供enum关键字用来定义枚举类,在IDEA中创建枚举类的菜单如下:

b514454ef5277536659676b0ec085089.png

同样定义一个季节的枚举类, 代码可以简洁如下:

package cn.osxm.jcodef.func.base;

public enum SeasonEnum {

SPRING, SUMMER, AUTUMN, WINTER

}

在枚举类中直接列出常量,常量遵循全部大写的规则。在上面的枚举类示例代码中,SPRING, SUMMER, AUTUMN, WINTER 是SeasonEnum的成员。

枚举成员默认是final、public、static (所以可以使用SeasonEnum.SPRING方式调用枚举成员)

每一个枚举类型成员都可以看作是枚举类的实例 (SeasonEnum.SPRING的类型也是SeasonEnum)

在JUnit使用测试如下:

@Test

public void enumBase() {

SeasonEnum season = SeasonEnum.SPRING;

Assert.assertTrue(season.equals(SeasonEnum.SPRING));

}

Java 枚举类的特性

Java枚举类的特性有:

枚举可以实现接口,但不能继承接口,也不能被继承。

枚举类是final的,所以不能继承。

枚举类的构造方法是私有的

枚举成员是静态、final和public

枚举成员是枚举类的实例

但是从上面SeasonEnum枚举类的定义来看,完全看不出这些特性,这些特性是怎么来的呢? 请看下面的原理探求。

Java枚举类实现的原理探求

Java枚举类型的奥秘就在编译阶段,枚举类在编译后会生成了一个扩展java.lang.Enum的类。这个可以通过JDK自带的javap工具来反编译生成的.class文件。对上面的生成的SeasonEnum.class文件进行反编译,因为这个文件的包路径是cn\osxm\jcodef\func\base,所以在命令行使用如下命令:

javap -p cn\osxm\jcodef\func\base\SeasonEnum.class

·-p参数的意思是反编译代码中包含私有的方法, p是private的意思。

c5e667d2c3089a5719d1ab5a487e1c7c.png

从控制台输出的反编译后的源码可以看出:

·自定义的枚举类会自动继承java.lang.Enum类

·每个成员变量都会被转换为 private static final的枚举类型的实例

·自动添加private的构造函数 从反编译后的源码就不难理解Enum的特性了。

注意: 使用专门的Java反编译工具,比如JD GUI、luyten等对Eumn进行反编译的效果接近源码的效果,无法看到继承等特性,JD-GUI反编译的效果和源码时一致的,这也说明使用JD GUI来进行实际的反编译还是不错的。

猜你喜欢:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223614.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午1:48
下一篇 2026年3月17日 下午1:48


相关推荐

  • vdbench – 性能压力测试工具

    vdbench – 性能压力测试工具vdbench 是一个 I O 工作负载生成器 通常用于验证数据完整性和度量直接附加 或网络连接 存储性能 vdbench 可以运行在 windows linux 环境 可用于测试文件系统或块设备基准性能

    2026年3月16日
    3
  • 《托马斯微积分》阅读笔记1

    《托马斯微积分》阅读笔记1认识增量增量当平面上一个质点从一点移动到另一点 其坐标的纯改变或增量通过把终点坐标减去起点坐标而求得 增量的定义 如果一个质点从点 x1 y1 移动到 x2 y2 其坐标的增量为 x x2 x1 以及 y y2 y1 读作 delta 指差 注 增量是可以为正数 0 和负数的 例题 1 求增量 从 0 0 到 9 8 的增量为 x 9 0 9 y 8 0 8 从 3 1 到 3 9 的增量为 x 3 3 0 y 9 1 8 从

    2026年3月18日
    2
  • 中控考勤系统登录用户名和密码初始化

    中控考勤系统登录用户名和密码初始化

    2021年8月25日
    253
  • 请求转发和重定向的区别

    请求转发和重定向的区别一 请求转发客户端只发送一次请求到服务器 服务器也只做一次响应给客户端 浏览器地址栏只会显示客户端第一次访问的 URL 相当于服务器将此次响应交给另一个 Servlet 处理 但还是当前 Servlet 请求转发的路径必须是同一个服务器下的地址 转发可以携带参数和 request 作用域的值 request getRequestDi path forward arg0 arg1 二 重定向客户端先发送一次请求到服务器 服务器给出响应给客户端告诉其访问另一个 url 从而

    2026年3月18日
    2
  • python基础串讲

    python基础串讲在 jupyter 中 ctrl enter 是执行该条语句 shift enter 是执行该条语句并且创建新的窗口 标识符以字母 数字 下划线组成 不能以数字开头 区分大小写 python3 支持中文符号 但是尽量不用 python 的保留字 不能用作常数或变数 只包含小写字母二进制 八进制 十六进制 输出时全部转化为十进制浮点数 复数 注释 单行用 多行用三个单引号或者双引号求余

    2026年3月17日
    2
  • 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机…「建议收藏」

    计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机…「建议收藏」关机提示windows7正在配置windows请勿关闭计算机,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示windows7正在配置windows请勿关闭计算机,然后等了一晚上也没有关掉。现在电脑无法正常关机有进程失去响应不能结束,所以停留在这个状态…

    2022年6月19日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号