【图灵干货】Java高级教程第十五节:Java枚举(Enum)类型原理探求
2021-11-24 14:13:29
Enum枚举类型。
Enum的全写是Enumeration,翻译为列举,逐个陈述,并加以细化。枚举类型是程序语言中一种特殊的数据类型(通常使用字符串,例如字符串,整体类型),这种数据类型的变量值局限于固定范围,如春、夏、秋、冬季节,月12个。
枚举来自Java。
枚举前时代
对于Java语言,枚举类型从JDK1.5开始。以前,使用接口静态常数来实现相关函数(或类静态常数),例如季节:
接口静态常数通常在没有使用枚举类之前被使用。
比如:
``java。
公共interfaceSeason{
发布状态统计=1;
publicstaticfinalintSUMER=2;
publicstaticfinalintAUTUMN=3;
publicstaticfinalintwinter=4;
}
```
进行以下JUnit测试:
``java。
@Test
(){
整数=1;
Assert.assertTrue(Season.Spring==i);
}
```
用界面静态常数限制变量的范围很困难,定义繁琐,功能有限。这样,Java1.5中定义了一个枚举类型:`java.lang.Enum`。
定义Java枚举。
定义Javaclass)和接口(interface),Java提供enum关键字来定义枚举类,在IDEA中创建以下枚举类菜单:
相同定义季节的枚举类,代码可以简明如下:
``java。
packagecn.osxm.jcodef.func.base;
公共搜索{
SPRING,SUMER,AUTUMN,WINTER。
}
```
枚举类中的常量直接列示,它遵循所有的大写规则。SPRING,SUMER,AUTUMN,WINTER是Seasonenum的成员,位于上面的枚举类示例代码中。
-枚举成员的值为final,public,static(这样就可以通过seasonenum.spring调用枚举成员)
-每种枚举类型的成员都可视为枚举类的一个实例(Seasonenum.SPRING类型也是Seasonenum)
进行以下JUnit测试:
``java。
@Test
{publicvoidenumbase(){
Seasonenumseason=Seasonenum.SPRING;
Assert.asserttrue(season.equals(Seasonenum.SPRING);
}
```
Java枚举类的特性。
Java枚举类:
枚举能够实现一个接口,但是无法继承接口,也无法继承。
枚举类为最终,无法继承。
枚举类的结构方法是专用的。
枚举成员为静态、非公开的。
枚举成员是枚举类的一个示例。
但根据上述Seasonenum枚举类的定义,这些特性是如何产生的呢?参阅下面的原则探索。
原理探索实现Java枚举类。
编译期是ava枚举类型的秘密,编译之后生成了一个扩展java.lang.Enum的类。该class文件可通过JDK自带javap工具反编译。反编译上面生成的Seasonenum.class文件,因为它的包路径是cnosxmjcodefuncbase,所以在命令行上使用以下命令:
```js
javap-pcnosxmjcodefuncbasesonenum.class。
```
-`-p`参数表示private在反编译代码中包括了private。
通过控制台输出反编译的源代码可以看到:
定制的枚举类会自动继承java.lang.enum`类。
每一个成员变数都会转化为privatestaticfinal的枚举类型。
为private自动添加结构函数。
Enum的特性在反编译源代码中并不困难。
注意:使用JDGUI、luyten等特殊的Java反编译工具,对Eumn的反编译效果接近于源代码,见不到继承等特,JDGUI反编译的效果与源代码一致,这也说明了用JDGUI进行实际反编译还不错。
图灵学院成立于2017年7月15日,现阶段提供 计算机基础原理、JavaSE核心、Java后端、 面试必备算法、python核心编程、数据分析、web 开发题、人工智能等专题课程,为想学习Python的学员提供优质的培训服务,帮助学员掌握更加全面的技能,是计算机人员职场中提职加薪的首选。
免费java架构师视频学习地址:免费视频