idea网站开发教程,一级a做爰电影片免费网站,艾艺的品牌网站设计,上海远丰电商网站建设公司怎么样Enum枚举类与静态变量和静态数组的区别 组成结构Enum枚举类静态变量静态数组 组成结构的区别相同之处不同之处 用法使用相同之处不同之处 组成结构
先来看下Enum枚举类#xff0c;静态变量#xff0c;静态数组的初始化过程#xff0c;以下面为例子#xff1a;
public enu… Enum枚举类与静态变量和静态数组的区别 组成结构Enum枚举类静态变量静态数组 组成结构的区别相同之处不同之处 用法使用相同之处不同之处 组成结构
先来看下Enum枚举类静态变量静态数组的初始化过程以下面为例子
public enum FruitEnum {APPLE, ORANGE, BANANA, PEAR, CANTALOUPE, CHERRY, KIWIFRUIT, WATERMELON;static String value i;static String[] strings {a, b, c, d, e, f, g, h};}Enum枚举类 /*** 每一个枚举值都分在一个enum**/// access flags 0x4019public final static enum Lcn/abs/FruitEnum; APPLE// access flags 0x4019public final static enum Lcn/abs/FruitEnum; ORANGE// access flags 0x4019public final static enum Lcn/abs/FruitEnum; BANANA// access flags 0x4019public final static enum Lcn/abs/FruitEnum; PEAR// access flags 0x4019public final static enum Lcn/abs/FruitEnum; CANTALOUPE// access flags 0x4019public final static enum Lcn/abs/FruitEnum; CHERRY// access flags 0x4019public final static enum Lcn/abs/FruitEnum; KIWIFRUIT// access flags 0x4019public final static enum Lcn/abs/FruitEnum; WATERMELON/*** 一个枚举值初始化一个枚举类对象* ICONST_* 代表的是枚举序列号**/NEW cn/abs/FruitEnumDUPLDC APPLEICONST_0INVOKESPECIAL cn/abs/FruitEnum.init (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.APPLE : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC ORANGEICONST_1INVOKESPECIAL cn/abs/FruitEnum.init (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.ORANGE : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC BANANAICONST_2INVOKESPECIAL cn/abs/FruitEnum.init (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.BANANA : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC PEARICONST_3INVOKESPECIAL cn/abs/FruitEnum.init (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.PEAR : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC CANTALOUPEICONST_4INVOKESPECIAL cn/abs/FruitEnum.init (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.CANTALOUPE : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC CHERRYICONST_5INVOKESPECIAL cn/abs/FruitEnum.init (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.CHERRY : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC KIWIFRUITBIPUSH 6INVOKESPECIAL cn/abs/FruitEnum.init (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.KIWIFRUIT : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC WATERMELONBIPUSH 7INVOKESPECIAL cn/abs/FruitEnum.init (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.WATERMELON : Lcn/abs/FruitEnum;/*** 提取每一个枚举类对象并封装成一个枚举静态数组 cn/abs/FruitEnum.$VALUES* ICONST_* 代表数组序列号**/BIPUSH 8ANEWARRAY cn/abs/FruitEnumDUPICONST_0GETSTATIC cn/abs/FruitEnum.APPLE : Lcn/abs/FruitEnum;AASTOREDUPICONST_1GETSTATIC cn/abs/FruitEnum.ORANGE : Lcn/abs/FruitEnum;AASTOREDUPICONST_2GETSTATIC cn/abs/FruitEnum.BANANA : Lcn/abs/FruitEnum;AASTOREDUPICONST_3GETSTATIC cn/abs/FruitEnum.PEAR : Lcn/abs/FruitEnum;AASTOREDUPICONST_4GETSTATIC cn/abs/FruitEnum.CANTALOUPE : Lcn/abs/FruitEnum;AASTOREDUPICONST_5GETSTATIC cn/abs/FruitEnum.CHERRY : Lcn/abs/FruitEnum;AASTOREDUPBIPUSH 6GETSTATIC cn/abs/FruitEnum.KIWIFRUIT : Lcn/abs/FruitEnum;AASTOREDUPBIPUSH 7GETSTATIC cn/abs/FruitEnum.WATERMELON : Lcn/abs/FruitEnum;AASTOREPUTSTATIC cn/abs/FruitEnum.$VALUES : [Lcn/abs/FruitEnum;可以看出Enum枚举类会将每一个枚举值都包装成一个带有枚举序列号的枚举类对象然后再将枚举类对象封装成一个枚举数组。 另外如上图所示例如public final static enum Lcn/abs/FruitEnum; APPLEenum 用了 final 来修饰Enum枚举类是不能够修改值。 静态变量 LDC iPUTSTATIC cn/abs/FruitEnum.value : Ljava/lang/String;从上面可以发现静态变量等同于一个枚举值初始化一个枚举类对象的环节。
静态数组
ANEWARRAY java/lang/StringDUPICONST_0LDC aAASTOREDUPICONST_1LDC bAASTOREDUPICONST_2LDC cAASTOREDUPICONST_3LDC dAASTOREDUPICONST_4LDC eAASTOREDUPICONST_5LDC fAASTOREDUPBIPUSH 6LDC gAASTOREDUPBIPUSH 7LDC hAASTOREPUTSTATIC cn/abs/FruitEnum.strings : [Ljava/lang/String;由此可见静态数组等同于把每一个枚举类对象封装成一个枚举数组的环节。
组成结构的区别
相同之处
Enum枚举类在中间把一个枚举值包装成一个枚举类对象这跟静态变量是一样的操作和结构。Enum枚举类最后也是封装成了一个静态数组这是跟静态数组一样的最终结构形态。
不同之处
Enum枚举类会把每一个枚举值都包装成一个枚举类对象后再封装成一个静态数组而不是像静态数组把每一个数值都直接封装到一个静态数组中。Enum枚举类比静态变量多了对静态数组的封装。
用法使用
相同之处
Enum枚举类静态变量和静态数组都是一经定义不可变更。Enum枚举类静态变量和静态数组都是存放在Metaspace中。
不同之处
Enum枚举类具有枚举序列号可以通过枚举类对象方法ordinal()提取能够利用此枚举序列号进行枚举类对象的序列比较和排序而静态数组可以按照stream流方式进行操作。Enum枚举类都是通过Enum Clazz.Enum Value来获取枚举值使用上安全不会出现越界而静态数组需要通过指定index来获取数值在指定index的时候不能保证index不越界index越界会抛出错误异常例如ArrayIndexOutOfBoundsExceptionIndexOutOfBoundsException。静态数组可以通过index直接获取值Enum枚举类则是通过直观的名字获取值。Enum枚举可以在switch()中运用静态变量和静态数组不能代表类型又代表不同数值没有办法在switch()中使用。Enum枚举类的枚举值就是枚举对象的名字元素类型单一并且需要匹配对象名字的命名规范。而静态变量和静态数组可以应用于不同的元素类型包括基本类型和对象类型。