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中创建枚举类的菜单如下:

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

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的意思。

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

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

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

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

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

猜你喜欢:

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

  1. java调用静态方法原理_传智播客:Java学科08static关键字的概述和使用格式以及静态原理...

    本文内容: static关键字本文输出内容: 能够理解static的关键字能够写出静态代码块的格式二.static关键字 概述关于static关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的 ...

  2. java多线程基础视频_[传智播客]Java基础视频教程之多线程2【10节课】

    一.课程简介 该视频包括Java基础视频课程线程安全问题.代码优化.生产者消费者.死锁.守护线程等,详细课程如下所示>> 1. 传智播客毕向东Java基础视频教程-day12-01-多线程 ...

  3. 传智播客 - java 就业面试题大全

      从享受生活的角度上来说:"程序员并不是一种最好的职业,我认为两种人可以做程序员,第一,你不做程序员,你就没有什么工作可做,或者说是即使有可以做的工作但是你非常不愿意去做:第二,你非常痴迷 ...

  4. 传智播客Java面试宝典 | 张老师尽心整理的面试宝典大全,面试阿里腾讯不成问题。西边人西说测试

    提示:本大全每半月更新一次,请持续保持关注!谢谢! 索取方式:头条或公众号中回复[面试] 从享受生活的角度上来说:"程序员并不是一种最好的职业,我认为两种人可以做程序员,第一,你不做程序员, ...

  5. 传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(2015年10月25日23:28:50)

    day01 win 7系统打开DOS有趣方法:按住shift+右键,单击"在此处打开命令窗口"(注意:在此处可以是任何的文件夹,不一定是桌面) 用DOS删除的文件不可以在回收站恢复 ...

  6. 传智java测试题答案_传智播客Java基础第一阶段习题

    关于java程序员面试的经典题目 传智播客Java基础第一阶段习题 一.单项选择题 1.Java源文件和编译后的文件扩展名分别为( ) A..class和 .java B..java和 .class ...

  7. 传智播客张孝祥java邮件开发随笔01

    01_传智播客张孝祥java邮件开发_课程价值与目标介绍 02_传智播客张孝祥java邮件开发_邮件方面的基本常识 03_传智播客张孝祥java邮件开发_手工体验smtp和pop3协议 第3课时 关于 ...

  8. 基于Java Web的传智播客crm企业管理系统的设计与实现

    项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等.这里根据疫情当下,你 ...

  9. java期中考试答案传智播客,传智播客java考试习题3.docx

    传智播客java考试习题3.docx 第三次作业 1.jar命令的()参数可以创建归档文件1分换题 o A.c o B.v o C.f o D.x 参考答案A 答案说明c参数,创建归档文件 2.下列选 ...

  10. 2015年传智播客java_2015年Java 8强势开始

    2015年传智播客java JDK 8从2015年开始,其博客文章和文章的受欢迎程度将激增. 这与本月将 Java 自动升级到JDK 8恰好吻合. 在这篇文章中,我列出并简要描述了2015年已经发布的 ...

最新文章

  1. systemd 对你的进程数限制横插一脚啦
  2. 回调函数在MFC中的使用
  3. OpenShift — Overview
  4. 输入n个字符串字典序排序_FSST - 快速字符串压缩算法
  5. Android 打开屏幕旋转
  6. Django 3.2.5博客开发教程:使用富文本编辑器添加数据
  7. 根据条件查询某条记录的条数_「性能与架构」MySQL 8 查询优化新工具 Explain Analyze...
  8. 简约好看的域名售卖页html源码
  9. flink EventTime与Window
  10. python queue pip
  11. Base64,DES,RSA,SHA1,MD5 笔记
  12. 软件网站安全性的设计与检测与解决方案
  13. wirelessmon
  14. 基于SpringBoot实现在线抽奖系统
  15. 交互设计|抖音为什么是上滑查看下一个视频
  16. ADAS不是自动驾驶汽车
  17. A7.2022年全国数学建模竞赛A题-波浪能最大输出功率设计-赛题分析与讨论
  18. tkinter-Entry详解
  19. 有趣的IDEA插件推荐,给你的开发工作增添色彩
  20. 2-4、React+antd页面UI美化——登录界面设计

热门文章

  1. 线上崩了?一招教你快速定位问题。
  2. python docx表格宽度_Python:如何調整docx中表格的行高度
  3. bitmap与mat互转方便opencv操作
  4. R9 7900X3D参数 R9 7900X3D性能怎么样 锐龙R97900X3D相当于什么水平
  5. 行!看到抖音上 Python 程序员晒得工资条,我沉默了
  6. 全程配图超清晰的Springboot权限控制后台管理项目实战第二期(Springboot+shiro+mybatis+redis)
  7. redis php lrange,Redis Lrange 命令
  8. Unity黑魂复刻经典教程心得(一)
  9. 酷玩Go命令行工具—Cobra
  10. 如何更方便的查看GitHub上的代码?