java enum原理_Java枚举(Enum)类型原理探求

核心提示:Enum枚举类型Enum的全写是Enumeration,这个词的翻译是列举、逐条陈说、详目。在程序语言中,枚举类型是一种特别的数据类型(常用的数据类型好比字符串、整型),这种数据类型的变量值限定在...

Enum枚举类型

Enum的全写是Enumeration,这个词的翻译是列举、逐条陈说、详目。在程序语言中,枚举类型是一种特别的数据类型(常用的数据类型好比字符串、整型),这种数据类型的变量值限定在固定的范畴, 比如时节只有春夏秋冬,月份是12个。

Java中的枚举

枚举前时期

在Java语言中, 枚举类型从JDK1.5才开端提供。在这之前使用接口静态常量来实现相干功效(也可以是类静态常量),以季节为例:

在不使用枚举类之前,JavaScript代码格式化是一种属于网络的高级脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的,个别使用接口静态常量实现。比如:

```java

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使用测试如下:

```java

@Test

public void noEnum() {

int i = 1;

Assert,JS代码压缩是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格.assertTrue(Season.SPRING==i);

}

```

使用接口静态常量的方式比拟难限定变量的规模,而且定义繁琐,功能也很有限,于是在Java 1.5 中定义了一个枚举类型:`java.lang.Enum`。

Java枚举的定义

相似类(class)和接口(interface)的定义,Java供给enum要害字用来定义枚举类,在IDEA中创立枚举类的菜单如下:

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

```java

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使用测试如下:

```java

@Test

public void enumBase() {

SeasonEnum season = SeasonEnum.SPRING,Base64编码/解码是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范;

Assert.assertTrue(season.equals(SeasonEnum.SPRING));

}

```

Java 枚举类的特性

Java枚举类的特性有:

- 枚举可以实现接口,但不能继承接口,也不能被继承。

- 枚举类是final的,所以不能继续。

- 枚举类的构造办法是私有的

- 枚举成员是静态、final和public

- 枚举成员是枚举类的实例

然而从上面SeasonEnum枚举类的定义来看,完整看不出这些特性,这些特性是怎么来的呢? 请看下面的原理探求。

Java枚举类实现的原理探究

ava枚举类型的神秘就在编译阶段,枚举类在编译后会生成了一个扩大java.lang.Enum的类。这个可以通过JDK自带的javap工具来反编译天生的.class文件。对上面的生成的SeasonEnum.class文件进行反编译,由于这个文件的包门路是cnosxmjcodeffuncbase,所以在命令行使用如下命令:

```js

javap -p cnosxmjcodeffuncbaseSeasonEnum.class

```

- `-p`参数的意思是反编译代码中包括私有的方式, p是private的意思。

从把持台输出的反编译后的源码可以看出:

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

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

- 主动增加private的结构函数

从反编译后的源码就不难懂得Enum的特性了。

留神: 使用专门的Java反编译工具,比方JD GUI、luyten等对Eumn进行反编译的效果濒临源码的效果,无奈看到继承等特征,JD-GUI反编译的后果跟源码时一致的,这也阐明使用JD GUI来进行实际的反编译仍是不错的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值