文章前记
程序员工作久了便可能整日忙碌于“增删改查”中,迷失方向,毫无进步。
该公众号致力于分享软件开发相关的原创干货,助你完成从程序员到架构师的进阶之路!
努力!做一个NB的Coder!

1 枚举类型初探

枚举类型,其语法总让人觉着怪怪的,如下:

简单的一行,就定义了包含四个值的枚举类型,缺总让人觉着语法有点怪异。而在使用时:

就可以得到输出:

那我们简单的一行定义中,到底发生了什么?枚举类型在编译时是怎样实现的?它还有着怎样的特点?

我们将会分几节对Java中的枚举类型进行介绍。

2 枚举产生之前

如果不使用枚举,我们要对“春夏秋冬”这四个值分别赋予一个数字,则常见的操作为:

上述方法定义十分繁琐,而且容易出错。例如我们定义的int数字出现重复,编译器也不会给出任何的警示。同时,这样的操作是实在太频繁了,最终Java 5中增加了枚举类型。

而是用枚举类型后,一切就变成了如下所示的简单几行:

而且,Java自动给按照枚举值出现的顺序,从0开始分配了编号。通过name()可以获得枚举值的名称,通过ordinal()可以获得枚举值的编号。

3 枚举实现原理

那我们定义枚举类型后,到底发生了什么呢?我们对枚举的实现原理进行探究。

首先,我们在实现Season枚举类时,并没有定义name()和ordinal()方法。我们从这里入手,点击该方法后,发现进入了一个抽象类:

并且,我们发现编译器不允许我们自行实现该抽象类从而构造一个新的类。但是,既然我们的Season枚举类可以调用其中的方法,因此Season枚举类应该是继承了该抽象类。

为了验证这一猜想,我们让Season类继承一个其他的类,发现果然不可以,因为Java是不允许多继承的。

具体,我们对Season类进行反编译,即:java -p Season.class,得到反编译后的结果:

我们看到,对与枚举类,有很多值的注意的点:

  • 枚举类在经过编译后确实是生成了一个扩展了java.lang.Enum的类
  • 枚举类是final的,因此我们无法再继承它了
  • 我们定义的每个枚举值都是该类中的一个成员,且成员的类型仍然是Season类型
  • 枚举类中被默认增加了许多静态方法,例如values()等

为了进一步了解每个方法中的操作,我们使用java -p -c Season.class每个方法中的字节码:

根据字节码,我们还原其操作代码,大致如下:

注意:以下代码为笔者自己翻译,如果有好的字节码查看工具请一定要留言告诉我啊。

通过这里我们可以看到,在类的static操作中,编译器帮助我们生成每个枚举值的对象。

4 总结

我们在总结一下,我们使用enum定义的枚举类型,会在编译之后转化为一个继承了java.lang.Enum的类,而我们定义的每个枚举值都会在类的初始化阶段被实例化为我们所定义的枚举类的一个对象。

同时,编译器还帮我们在类中增加了两个方法,分别是:values()和valueOf()。

至此,我们对Java的枚举对象有了彻底的认识。

但是,我们依旧有着很多的疑惑:

  • 编译器插入的方法和正常的方法有无不同
  • 枚举类型还有哪些使用上的注意点,例如相关方法和操作
  • 枚举类型的实现上还有哪些特殊之处

这些,我们在接下来的文章中继续分析。

—END—

建议:原创不易,请 赞同 后再收藏!

分享让你从程序员进阶架构师的原创干货!

欢迎关注我,不错过每期的原创干货!

java 枚举_Java中的枚举类型(Enum)详解相关推荐

  1. java ==和===_java中==和equals的区别详解

    分析前基础了解: 一)JVM把内存划分成两种:一种是栈内存,一种是堆内存. ①在函数中定义的一些基本类型的变量和对象的引用变量(变量名)都在函数的栈内存中分配. ②当在一段代码块定义一个变量时,Jav ...

  2. (17)System Verilog枚举类型enum详解

    (17)System Verilog枚举类型enum详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog枚举类型enum详解 5)结语 ...

  3. java中迭代器要导包吗_java 中迭代器的使用方法详解

    java 中迭代器的使用方法详解 前言: 迭代器模式将一个集合给封装起来,主要是为用户提供了一种遍历其内部元素的方式.迭代器模式有两个优点:①提供给用户一个遍历的方式,而没有暴露其内部实现细节:②把元 ...

  4. java中math的方法_Java中Math类常用方法代码详解

    近期用到四舍五入想到以前整理了一点,就顺便重新整理好经常见到的一些四舍五入,后续遇到常用也会直接在这篇文章更新... public class Demo{ public static void mai ...

  5. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  6. java 静态 编译_Java中的动态和静态编译实例详解

    Java中的动态和静态编译实例详解 首先,我们来说说动态和静态编译的问题. Q: java和javascript有什么区别? 总结了一下:有以下几点吧: 1.首先从运行环境来说java代码是在JVM上 ...

  7. java foreach标签_Java中Velocity foreach循环标签详解

    Java中Velocity foreach循环标签详解 Java Velocity中foreach循环可以很容易的遍历数组或者集合. 定义 #foreach( $elem in $allElems) ...

  8. Java枚举类型(enum)详解

    文章目录 理解枚举类型 枚举的定义 枚举实现原理 枚举的常见方法 Enum抽象类常见方法 编译器生成的Values方法与ValueOf方法 枚举与Class对象 枚举的进阶用法 向enum类添加方法与 ...

  9. java中的枚举_Java中的枚举

    java中的枚举 Enum was introduced in Java 1.5 as a new type whose fields consists of a fixed set of const ...

最新文章

  1. fedora17 的 rc.local
  2. 重磅:腾讯正式开源图计算框架Plato,十亿级节点图计算进入分钟级时代
  3. linux 调用 fudanNLP
  4. 5月份,我居然发了这么多文章?我果然无聊.
  5. javascript for java 一个可以让用户通过JAVA调用JAVASCRIPT的JAVA包
  6. 苹果发布会邀请函被玩坏:神似桂林西瓜霜
  7. linux shell 解析文本文件,linux Shell 全解析
  8. 华为STP相关功能配置
  9. seo外链工具是什么?外链工具有用吗?
  10. [C]结构体数组初始化
  11. Bytes和bits的区别(字节和位的区别)
  12. 完美解决VMware安装后没有VMnet1和VMnet8的问题
  13. 摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”
  14. Catia V5-6R2016软件安装教程——附下载地址
  15. 【Python】未知来源的Python 2020期末考试试题,大家可以来答题学习了
  16. 现在有很多第三方的SDK来做直播,那么我们改选择哪一种?
  17. 产业区块链一周新动态
  18. 阿里云本地SSD型实例i2gne云服务器配置性能详解
  19. 六、 rewrite的使用
  20. excel 根据起始日期计算到期日

热门文章

  1. java13页_Java 13 新特性及实战案例
  2. 电脑连接电视方法详解_HDMI高清线如何连接电脑与电视,简单安装步骤,真是太有用了...
  3. Python中字典get方法的使用
  4. Python基础教程:括号()[]{}详解
  5. html流动布局,自适应css布局——流动布局新时代
  6. java线程切换 notify_浅谈 Java线程状态转换及控制
  7. 数据库本地的sa有个叉号_搞定sql数据库出错,做自己的大神!
  8. web.xml隐藏html,web.xml
  9. 辽宁省2021年高考成绩位次查询,辽宁2021八省联考分数、位次表(非官方),附志愿填报样表...
  10. C语言编译报错:incompatible pointer type [-Wincompatible-pointer-types](传参类型不匹配)