当前位置: 首页 > 图灵资讯 > 技术篇> 【图灵干货】Java高级教程第十五节:Java枚举(Enum)类型原理探求

【图灵干货】Java高级教程第十五节:Java枚举(Enum)类型原理探求

来源:图灵教育
时间:2021-11-24 14:13:29


 <a href=https://www.tulingxueyuan.cn/tlzx/jsp/626.html target=_blank class=infotextkey>Enum</a>枚举类型  

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

1604039313499938.png

  相同定义季节的枚举类,代码可以简明如下:

  ``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。

1604039343761393.png

  通过控制台输出反编译的源代码可以看到:

  定制的枚举类会自动继承java.lang.enum`类。

  每一个成员变数都会转化为privatestaticfinal的枚举类型。

  为private自动添加结构函数。

  Enum的特性在反编译源代码中并不困难。

  注意:使用JDGUI、luyten等特殊的Java反编译工具,对Eumn的反编译效果接近于源代码,见不到继承等特,JDGUI反编译的效果与源代码一致,这也说明了用JDGUI进行实际反编译还不错。

       图灵学院成立于2017年7月15日,现阶段提供 计算机基础原理、JavaSE核心、Java后端、 面试必备算法、python核心编程、数据分析、web 开发题、人工智能等专题课程,为想学习Python的学员提供优质的培训服务,帮助学员掌握更加全面的技能,是计算机人员职场中提职加薪的首选。
       免费java架构师视频学习地址:免费视频