枚举的性质:?
1、枚举类默认继承Enum这个抽象类
2、枚举构造方法默认是私有的
3、枚举是不能被继承的
4、枚举非常安全,不能通过反射获取枚举的实例对象
public enum TestEnum2 {
RED("red",1),BLACK("black",2),
GREEN("green",3),WHITE("white",4);//枚举对象
public String color;
public int oridinal;
TestEnum2(String color,int oridinal){//创建一个带参数构造方法,否则上面的RED("red",1)会报错
//*枚举构造方法默认是私有的
this.color=color;
this.oridinal=oridinal;
}
}
?可见,创建一个枚举对象时要创建一个构造方法,要注意的是构造方法默认是私有的,可不能写一个public在前面。
public class TestEnumReflect {
public static void reflectPrivateConstructor(){
try {
Class<?> classEnum=Class.forName("enumdemo.TestEnum2");//获取枚举对象
Constructor<?> dl=
classEnum.getDeclaredConstructor(String.class,int.class,String.class,int.class);
//获取构造方法:枚举类默认继承Enum这个抽象类,而Enum中有含两个参数的构造方法,所以要传4个参数
//因为枚举的构造方法都是私有的,所以要改变私有的访问权限为true
dl.setAccessible(true);//改变私有的访问权限为true
Object objectstudent=dl.newInstance("绿色",333,"红色",999);//实例化
/*TestEnum2 testEnum2= (TestEnum2) objectstudent;
System.out.println(testEnum2);*/
System.out.println(objectstudent);//获取枚举的私有的构造函数
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
reflectPrivateConstructor();
}
?此时还是不可以获取枚举的私有方法,可见枚举是安全的。
枚举的方法:
values() 以数组形式返回枚举的所有成员
ordinal() 获取枚举成员的索引位置
valueOf() 把字符串变成对应的枚举对象
compareTo() 比较两个枚举的大小(通过索引比较的)
public enum TestEnum {
RED("red",1),BLACK,GREEN,WHITE;//枚举对象
public String color;
public int oridinal;
TestEnum(String color,int oridinal){//创建一个带参数构造方法,否则上面的RED("red",1)会报错
//*枚举构造方法默认是私有的
this.color=color;
this.oridinal=oridinal;
}
TestEnum(){//创建一个空的构造方法,否则上面的BLACK……会报错
}
public static void main(String[] args) {
TestEnum testEnum=TestEnum.valueOf("RED");//valueOf()把字符串变成对应的枚举对象
System.out.println(testEnum);
System.out.println(RED.compareTo(BLACK));//compareTo()比较两个枚举的大小(通过索引比较的)
}
public static void main2(String[] args) {
TestEnum[] testEnums=TestEnum.values();//values()以数组形式返回枚举的所有成员
for (int i = 0; i < testEnums.length; i++) {
System.out.println(testEnums[i]+"->"+testEnums[i].ordinal());//ordinal()获取枚举成员的索引位置
}
}
|