温馨提示 :所有自定义的枚举类都默认继承 java.lang.Enum 类,本节内容结合 java.lang.Enum 类进行讲解,切勿混淆
-
1、定义一个枚举类,枚举的实例定义必须是大写
-
2、枚举类不可以 new 实例对象,因为自定义的枚举,都默认继承 Enum 类,且 Enum 类是抽象类,所以不可以产生实例
Enum 类
举个例子:
-
3、switch 支持枚举类型
执行结果
-
4、Enum 类中的 ordinal 属性及相关方法
举个例子:
-
5、Enum 类中与 name 有关的方法
name() 方法
toString() 方法
valueOf() 方法
举个例子:
-
6、Enum 类中的跟比较有关的方法
equals() 方法
compareTo() 方法
举个例子:
-
7、Enum 类中的其他方法
getDeclaringClass() 方法
举个例子:
-
8、valus() 方法
它的作用是 把枚举的属性,都变成一个数组;此方法在源码中并不存在,是编译器自己生成的静态方法
举个例子:
-
9、在 IDEA 创建一个枚举类
**注意:**1、所有枚举类的构造函数必须是私有的,默认为私有的
2、当给构造函数添加参数的时候,属性会报错,因为 RED、GREEN 等就是实例,必须给它们加参数
-
10、枚举与反射
在上面,明明刚创建了含有两个参数的私有构造函数,这里却报错,为什么呢?这里有一个面试题:
普通类把构造函数私有化,虽然外部无法直接 new 对象,但依然可以通过反射访问该类私有构造函数生成对象。但是枚举的构造函数只能是私有的,得到这个构造函数之后,却不能通过 newInstance() 得到实例?
我们来打印所有的构造函数,看有没有两个参数的构造函数
发现有四参数构造函数,那我们就用反射访问一下四个参数的构造函数函数试试
结果是枚举通过反射根本 newInstance() 不出实例,可以看出用枚举去实现单例模式很安全
Constructor 中的 newInstance() 方法源码