文章目录
- 一、枚举
- 1.概念
- 2.使用
- 1.switch语句
- 2.Enum类中的方法
- 3.枚举无法反射
一、枚举
1.概念
- 将一组常量组织到一起,统一进行管理
- 避免了定义常量时,可能发生的歧义
- 枚举更加安全
- 枚举不可继承,无法扩展
public enum TestEnum {
//枚举对象,具备了类型
RED,GREEN,YELLOW;
}
- 是java.long.Enum的子类,自己写的枚举类,默认继承于这个抽象类
2.使用
1.switch语句
public static void main(String[] args) {
TestEnum color = RED;//Red
switch (color){
case RED:
System.out.println("Red");
break;
case GREEN:
System.out.println("Green");
break;
case YELLOW:
System.out.println("Yellow");
break;
default:
System.out.println("error");
break;
}
}
}
2.Enum类中的方法
方法 | 功能 |
---|---|
values() | 以数组形式返回枚举类型的所有成员 |
ordinal() | 获取枚举成员的索引位置 |
valueOf() | 将普通字符串转换为枚举实例 |
compareTo() | 比较两个枚举成员在定义时的顺序 |
- 在Enum 的 API 文档中找不到values() 方法,是编译器自动生成的
- 方法继承自枚举类
public static void main(String[] args) {
TestEnum[] values = TestEnum.values();
//以数组形式返回枚举类型的所有成员
for (int i = 0; i < values.length; i++) {
System.out.println(values[i].ordinal());
//获取枚举成员的索引位置
} //0 1 2
TestEnum testEnum = TestEnum.valueOf("RED");
//将普通字符串转换为枚举实例
System.out.println(testEnum);//RED
System.out.println(GREEN.compareTo(YELLOW));//-1
//比较定义时的顺序,Green比Yellow小,返回一个小于0的数
}
- Enum类中只有一个构造方法,并且带有参数
- 枚举的构造方法,默认是私有的
public enum TestEnum {
//枚举对象,具备了类型
RED(1,"红色"),
GREEN(2,"绿色"),
YELLOW(3,"黄色");
private int ordinal;
private String color;
TestEnum(int ordinal,String color){
this.ordinal = ordinal;
this.color = color;
}
3.枚举无法反射
-
因为自己写的枚举类,默认继承于Enum类,同时默认调用这个类中的构造方法
-
所以在反射时,一个要传四个参数 。要给父类构造方法传递 ,进行初始化
public static void func() throws ClassNotFoundException,
NoSuchMethodException, InvocationTargetException,
InstantiationException, IllegalAccessException {
Class<?> C1 = Class.forName("Enum.TestEnum");
Constructor<?> constructor = C1.getDeclaredConstructor(String.class,int.class,int.class, String.class);
constructor.setAccessible(true);
TestEnum WHITE = (TestEnum) constructor.newInstance("透明",0,6, "白色");
System.out.println(WHITE);
}
public static void main(String[] args) throws ClassNotFoundException,
InvocationTargetException, NoSuchMethodException,
InstantiationException, IllegalAccessException {
func();
}
- 源码表面:禁止通过反射,来创建枚举对象
- 因此,枚举对象非常安全,不会通过反射创建枚举对象.
点击移步博客主页,欢迎光临~