【枚举高阶】Java中枚举的本质是什么
2018-01-16 09:48
281 查看
前言
从2013年开始接触SSH开发到现在,期间基本没有用过Java的Enum,直到最近有新项目,代码中大量使用Enum,才开始了解java中的Enum。其实Enum的本质,和之前用得很多的static类成员是一样的,不过更直观,易用。老代码中继续使用static类,其中一个原因是兼容jdk1.5之前的代码。Java中枚举的特性
01.Enum不可以有public或者protected的构造方法,只能是private或friendly(就前面不用修饰符),这样可以保证客户代码不能新建一个Enum的实例,我们也不需要实例化Enum对象。02.Enum的枚举值都是public static final(非枚举值可以不是)
03.Enum默认实现了java.lang.Comparable接口
04.Enum重写了toString()
05.Enum提供valueOf(),这个方法与toString相对应,因此重写toString(),一定要重写valueOf()
06.Enum提供values()可以遍历枚举值 返回的就像ArrayList的对象,然后我们可以这样遍历每个枚举值
07.Enum的长度values().length
08.Enum提供oridinal()可以返回枚举值顺序
枚举特性背后的原理
下面是一个Color枚举类型编译后的代码,可以看到,枚举的本质就是静态类中带静态变量,这和之前的工程中常见的代码是一样的,很多老旧工程中继续使用静态类,可能是延续java1.5以前的常规做法,积重难返。Compiled from "Color.java" public final class Color extends java.lang.Enum<Color> { public static final Color RED; public static final Color BLUE; public static final Color BLACK; public static final Color YELLOW; public static final Color GREEN; public static Color[] values(); public static Color valueOf(java.lang.String); static {}; }
一,enum类型是一个不可以被继承的final类。其枚举值都是Color类型的类静态常量(这也是为什么enum会大写的原因)。
二, 既然是类,所以enum类型也有构造函数,方法和域。
但是枚举还是有自己的特殊性:
enum Color{ RED(255, 0, 0), BLUE(0, 255, 0), GREEN(0, 0, 255);//注意此处必须有分号 private Color(int r, int g, int b){ this.r = r; this.g = g; this.b = b; } private int r, g, b; public String toString(){ return super.toString() + "(" + r + ", " + g + ", " + b + ")"; } }
(1) 枚举的构造函数只有在构造枚举值时被调用
(2) 为了确保构造函数不会被外部调用,因此构造函数必须是private的。
(3) 所有enum类型都会继承Enum.java的方法,包括:
a. ordinal()方法:返回枚举值在enum类中的顺序。这个顺序依据枚举值声明时的顺序而定。
Color.RED.oridinal(); //返回结果:0
b. compareTo()方法:
Color.RED.compareTo(Color.BLUE); //返回结果:-1
c. toString():返回枚举值的名称
Color.RED.toString(); //返回结果:RED
d. values():返回一个包含全部枚举值的数组
Color[] colors = Color.values();
e. valueOf():返回枚举值常量
Color.valueOf(“BLUE”); //返回结果:Color.BLUE
d. equals() : 比较两个枚举类对象的引用。
public final boolean equals(Object other){ return this == other; }
相关文章推荐
- java的引用明明和指针没什么本质区别,java为什么还宣称没有指针并把这个当作语言的优点?
- 透析Java本质-谁创建了对象,this是什么
- Java 枚举:理解枚举本质
- Java学习——Servlet 本质是什么 servlet运行原理
- 透析Java本质-谁创建了对象,this是什么
- java 中0x的数值表示方式 本质上是什么意思?
- 透析Java本质-谁创建了对象,this是什么
- Java 枚举:理解枚举本质
- java枚举到底是什么鬼?
- 引用的本质是什么(c++,c#,java)?
- Java枚举 —— 很少被使用,或许是因为真正了解它的人太少了
- java类中serialversionuid 作用是什么
- Java 枚举(enum) 详解7种常见的用法
- PO/VO/DAO/BO/POJO是什么(JAVA几种对象的解释)
- java web 中的${pageContext.request.contextPath }是什么意思
- JAVA枚举
- 主题:Java 枚举7常见种用法
- Java堆空间:它是什么?
- Java中的属性和字段有什么区别
- java 枚举