0编译器详解_详解Java枚举类型(Enum)中的方法

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

在上篇文章中,我们对Java中的枚举类进行了详细的介绍。

对于Enum还不了解的小伙伴,可以先预习《Java中的枚举类型(Enum)详解》一文。

通过反编译,我们知道Java枚举类会在编译之后转化为一个继承了java

.lang.Enum的类,而我们定义的每个枚举值都会在类的初始化阶段被实例化为我们所定义的枚举类的一个对象。

在枚举类被编译之后,有一些方法是编译器在编译阶段写入的,那这些方法有什么特点?枚举类中还有一些继承来的方法,它们又有哪些?枚举类中的枚举值是在编译阶段被创建为对象,那构造函数又在哪?

这篇文章我们将详细分析。

1 Enum抽象类常见方法

我们上篇文章已经讲过,枚举类实际上继承了Enum抽象类,因此Enum抽象类是所有枚举类型的基本类,下面是它的常见方法:

  • ordinal()方法:该方法获取的是枚举变量在枚举类中声明的顺序,下标从0开始,如日期中的MONDAY在第一个位置,那么MONDAY的ordinal值就是0,如果MONDAY的声明位置发生变化,那么ordinal方法获取到的值也随之变化,注意在大多数情况下我们都不应该首先使用该方法,毕竟它总是变幻莫测的。
  • compareTo(E o)方法:则是比较枚举的大小,注意其内部实现是根据每个枚举的ordinal值大小进行比较的。
  • name()方法与toString():几乎是等同的,都是输出变量的字符串形式。
  • getDeclaringClass(): 返回该枚举变量所在的枚举类。

需要再次说明的是,以上的方法都是Enum抽象类的方法,会被Enum的对象继承,而不是Enum的静态方法。而最终枚举值被实例化成了Enum对象,所以,枚举值拥有以上的方法。

这一块比较简单,我们直接举例子说明:

首先我们定义一个最简单的枚举类:

c5c34c20a1494a3fb5376819a70eea17.png

之后我们在定义一个附带属性的枚举类:

20f0f97cd274fee3928b2d1934fb791f.png

接下来,我们写方法进行试验:

b492cf8ccdcaa5bfe6ddfebad6026a7a.png

最后结果:

c84b3b104b3ccfebeff2a40c9223c624.png

我们可以看到,对于每个枚举值,可以调用上述的继承自Enum抽象类的方法。

2 枚举类型的构造函数

既然枚举值是由编译器创建为枚举类型的实例,那它必然调用了构造函数。那该函数在哪呢?我们能不能调用呢?

其实该构造函数也在Enum抽象类中。

f53f36e137abfbe2aa19e22484268776.png

我们特意将方法注释也保留了下来,可以看到,该方法只能由编译器调用,开发人员无法调用。所以说,我们还是不要操心了,只需要定义好枚举类型,剩下的交给编译器。

3 再论编译器插入的静态方法

我们知道values()方法和valueOf(String s)方法是由编译器插入到枚举类中的静态方法。这总让人觉得怪异。而同时,我们知道枚举类型中的每一个枚举值也在编译阶段被声明为了一个枚举类。关于这几点,我们在上一篇文章中已经详细分析,大家可以回上篇文章找回记忆。我们直接贴出通过字节码推出的代码,如下:

e64045d095bee121efbc42ad3ffb0845.png

有人会这么认为:

  • 原来的Season枚举类中被编译器插入了values()方法和valueOf(String s)方法,因此能够正常调用Season.values()
  • 如果我们使用某个枚举值,如Season.AUTUMN向上转型成为Season枚举类,则无法调用values()方法和valueOf(String s)方法

其实这是不对的,因为无论是原生的Season枚举类还是Season.AUTUMN向上转型成的Season枚举类,本质上是同一个枚举类。因此,都应该可以调用values()方法和valueOf(String s)方法。

对此,我们进行验证:

d1d211a169bdb3062b4711eccaf6b593.png

得到如下输出:

298cf2562f1ffcc8d129fb97f0e724a2.png

证明了笔者的猜测。

4 总结

通过该文章,我们对枚举类中的方法进行了全面的了解:

  • 枚举类在编译阶段会被编译器插入一些静态方法
  • 枚举类本身有个只有编译器能够调用的构造方法,编译器会使用该方法将枚举值实例化为枚举类型的对象
  • 枚举值被实例化后,继承了众多java.lang.Enum中的方法

这样,通过《Java中的枚举类型(Enum)详解》和本篇文章,我们对枚举类型的原理和方法有了详细的了解。接下来,我们还会有一篇文章介绍枚举类型的使用,从而从原理、特性、使用三个方面对枚举类型进行详细的介绍,欢迎继续关注。

—END—

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 对象 调出r_【转】Linux - chown 中的 -R 参数

1. 查看目录及当前文件[rootlocalhost yuechaotian]# pwd/home/yuechaotian[rootlocalhost yuechaotian]# ll总用量 8drwxr-xr-x 3 root root 4096 12月 7 14:52 studydrwxr-xr-x 2 root root 4096 12月 9 21:43 test[rootlocalhost yuechaotian]# ll test总用量 12-rwxr-x…

选中内容_Excel – 选中的单元格自动显示在A1,报表演示数据再多也能看清

当我们要拿一张数据量比较大的报表做演示时,是不是经常会这样?演示者:今年 xxx 月的销售业绩不错,总计 xxx,比上月增长了 xx%。领导们:你说的这数字在哪?演示者:请您看投影上第 23 行…

5渲染判断_先渲染再对焦,KeyShot 深度通道在 Photoshop 中的对接

事情的起因,是在我用华为 P40 Pro 手机的时候,发现华为拍照系统当中的先拍照后对焦功能实在强大,那我会想到这个东西能不能用在我们产品渲染当中呢?仔细想一想这个东西,无非就是通过距离判断相机对焦点和景深的一个做法…

adc0809引脚图及功能_80C51单片机的引脚及其功能介绍

首先我们来连接一下单片机的引脚图,如果,具体功能在下面都有介绍。单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。⒈ 电源: ⑴ VCC - 芯片电源,接5V;⑵ VSS - 接地端;⒉ 时钟&…

http发送16进制报文_HTTP系列探索HTTP网络层的”前端性能优化“

作者:前端学苑 公号 / 前端小贾 (本文来自作者投稿)编者荐语性能是前端编码规范、网络层面、辅助工具等相互作用的结果。这是一个兼顾广度和深度的问题,优化好了可以加快首屏加载速度提高用户留存率,节省服务器资源降低成本等,也是…

mysql报错级别_MySQL启动出现几个警告级别错误

日志如下2015-03-2720:45:324876[Note]InnoDB:Usingatomicstorefcountbufferpoolpages2015-03-2720:45:324876[Note]InnoDB:TheInnoDBmemoryheapisdisabled2015-03-2720:45:324876[Not...日志如下2015-03-27 20:45:32 4876 [Note] InnoDB: Using atomics to ref count buffer p…

mysql 使用储存过程_为什么使用mysql储存过程?mysql储存过程简介

存储过程需要MySQL 5 MySQL 5添加了对存储过程的支持,因此,本章内容适用于MySQL 5及以后的版本。迄今为止,使用的大多数SQL语句都是针对一个或多个表的单条语句。并非所有操作都这么简单,经常会有一个完整的操作需要多条语句才能完…

mysql查看表结构修改记录表_MySQL 表结构查看以及表结构修改

使用MySql数据库时,如果对表字典不够熟悉,我们就需要查看表结构。如果数据库是在远程linux上部署,很多时候我们只能通过mysql的命令来查看表结构。同样,如果我们想要修改表结构,添加、删除、修改列时,也只能…

69讲入门python_Python入门,一定要吃透这69个内置函数

内置函数就是Python预先定义的函数,这些内置函数使用方便,无需导入,直接调用,大大提高使用者的工作效率,也更便于程序的阅读。截止到Python版本3.9.1,Python一共提供了69个内置函数。如果你还没入门&#x…

imgkit分辨率_pythonhtml2image: imgkit 和 wkhtmltoimage的坑

场景需要根据信息,将一个动态页面生成图片。经过调研,发现只有imgkit符合要求。imgkit其实是调用wkhtmltopdf的wkhtmltoimage(wkhtmltopdf包含wkhtmltopdf和wkhtmltoimage两个工具)来实现功能。wkhtmltopdf和wkhtmltoimage是通过调用QT来实现功能&#x…

mysql sql组合_详解mysql 组合查询

使用UNION多数SQL查询都只包含一个或多个表中返回数据的单条SELECT语句。MySQL也允许执行多个查询(多条SELECT语句),并将结果作为单个查询结果集返回。这些组合查询通常称为并(union)有两种情况需要使用组合查询:在单个表查询中从不同的表返回类似结构的…

mysql 共享表空间存储_MySQL InnoDB共享表空间

简介ibdata1ibdata1文件是InnoDB存储引擎的共享表空间文件,存放位置my.ini 中的 datadir"D:\phpStudy\MySQL\data",目录下。查看innode_file_per_table 参数的状态show variables like %per_table;表空间Innodb存储引擎可将所有数据存放于ibda…

python36中文手册_python36中文手册_python_36_文件操作4

fopen(test.txt,a,encodingutf-8)#f.truncate()#截断,不指定将清空所有内容f.truncate(5)#从头开始截断,截断5个字符 注:使用f.seek()改变光标位置不顶用f.close()fopen(yesterday,r,encodingutf-8)#读写文件print(f.readline())print(f.read…

bigdecimal负数变正数_BigDecimal的用法详解

BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负scale 次幂。 float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广…

mysql 表引擎 entity framework_EntityFramework之数据库以及表基本创建(一)

前言之前有学过EF一段时间那时EF才4.0似乎还不太稳定,而现在EF都已7.0版本,同时AspNet Identity都与此大有关联,看来是大势所趋于是开始学习EF,在学EF过程中也遇到一些小问题,特此录下,以备忘!数…

mysql+linux+无法启动服务无法启动不了_Linux实例中MySQL服务常见的无法启动或启动异常处理...

概述本文介绍了在Linux实例中,MySQL常见的无法启动或启动异常处理方法。详细描述常见问题处理描述,目录如下。提示:MySQL错误日志通常记录在/alidata/log/mysql/error.log文件下。MySQL配置文件my.cnf权限问题导致无法启动,错误提…

python3缺少pip_Ubuntu中找不到pip3命令的解决方法

Ubuntu中找不到pip3命令的解决方法Ubuntu 有 python2 和 python3。今天使用 Ubuntu 中的 python3 时,想要安装第三方库却发现 pip 指向的是 python2 。因为记得 Ubuntu 系统默认将 python3 的 pip 命令改成了 pip3,于是执行 pip3 -V ,报命令不…

python库迁移到没有网的电脑_python实现数据库跨服务器迁移

数据库从一个服务器转移到另外一个服务器,怎么转?你可以用一分钟遇见一个人,用一小时了解一个人,用一天爱上一个人,但是你却要用一辈子忘记一个人。分离,附加?还是备份、还原?具体过…

45道mysql数据库题目_MySQL 45道练习题

--1、 查询Student表中的所有记录的Sname、Ssex和Class列。SELECT sname,ssex,class FROMstudent;--2、查询教师所有的单位即不重复的Depart列SELECT DISTINCT depart FROMteacher;--3、查询Student表的所有记录。SELECT * FROMstudent;--4、查询Score表中成绩在60到80之间的所…

linux mysql revoke_Linux环境下MySQL基础命令(4)----数据库的用户授权

MySQL数据库的root用户拥有对所有库,表的全部权限,频繁的使用root用户会给数据库带来很大的风险,因此应建立一些低权限用户,只负责一部分库、表的管理维护操作,甚至可以对增、删、改、查各个操作进一步细化限制&#x…