Java基础之枚举

一.基础语法

定义一个枚举,关键字是enum,本质:是Java.lang.Enum的子类,也就是说,自己写的枚举类,就算没有显示的继承Enum,但是却默认继承了这个类

Java基础之枚举_第1张图片

二.使用

1.switch case语句

Java基础之枚举_第2张图片

2.Enum中的常用方法

values():以数组形式返回枚举类型的所有成员

ordinal():获取枚举成员的索引位置

Java基础之枚举_第3张图片

Java基础之枚举_第4张图片

valueOf:将普通字符串转换为枚举实例

Java基础之枚举_第5张图片

Java基础之枚举_第6张图片

compareTo:比较俩个枚举成员的顺序

Java基础之枚举_第7张图片

三.注意

1.继承于Enum类这个抽象类

2.RED BLACK GREEN都是枚举对象,即类的实例

Java基础之枚举_第8张图片

3.枚举不可以在其他方法中实例化对象:

Java基础之枚举_第9张图片

这样会报错

4.枚举也可以有自己的构造方法,但必须是私有的,如下:

Java基础之枚举_第10张图片

而且private可以省略,因为是默认私有:

Java基础之枚举_第11张图片

5.可以写一个带参数的构造方法:

Java基础之枚举_第12张图片

但注意,这样的话就必须添加成员变量,并且对枚举对象进行赋值,如下:

Java基础之枚举_第13张图片

换句话说,当枚举对象有参数后,需要提供相应的构造函数

6.枚举可以有成员变量,可以是任意权限

7.可以有成员方法

8.Enum类有唯一一个构造方法

Java基础之枚举_第14张图片

但注意,为什么我们可以创建没有参数的枚举对象?因为编译器会默认进行处理

9.拿到枚举实例

这俩种方法都可以

四.枚举与反射

我们知道,枚举是一个私有类,其构造方法是私有的,那我们是否可以通过反射拿到它的实例对象,同时调用其私有的构造方法

1.枚举不可以通过反射调用构造方法从而创建类的实例

按照反射的讲解,我们可以调用如下构造方法:

Java基础之枚举_第15张图片

代码如下:

但是却报错,说没有此方法:

这是为什么?明明我们自己写的就是带俩个参数的构造方法。这是因为枚举类比较特殊,我们所有的枚举类都是默认继承了Enum类的,继承了什么?继承了父类除了构造方法外的所有东西,并且子类要帮助父类构造!而我们所写的类并没有帮助父类构造!那意思是,我们要在自己写的构造方法中提供super吗?不是的,枚举比较特殊,虽然我们写了两个参数,但它还默认添加了两个参数,哪两个参数?就是Enum源码中的:

Java基础之枚举_第16张图片

那这两个参数在我们所写参数的前还是后呢?答案是在前,所以代码要改写成:

但还是报错:无法反射创建枚举对象

看getDeclaredConstructor的源码:

表示如果该类是一个枚举类,就不可以通过反射创建对象,所以枚举是绝对安全的

即枚举不可以通过反射调用任何构造方法,不可以通过反射创建类的实例

2.可以通过反射调用成员方法以及成员变量

Java基础之枚举_第17张图片

你可能感兴趣的:(java,开发语言,枚举,枚举与反射)