在JDK1.5 之前,我们定义常量都是: public static fianl.... 。很难管理。
枚举,其实就是一个放常量 (相关常量) 的类,方便管理常量。
枚举的所有类都继承了Enum这个抽象类
一、创建枚举类
创建一个枚举类:选择Enum即可
创建枚举类型,其中传的参数,都是自己想传进去的,便于更好的的分辨Level对象。(不常见)
public enum Level2 {
//描述枚举类型 (其实就是创建枚举对象)
LOW(1),MEDIUM(50),HIGH(100);
//属性
private int levelValue;
private Level2(int levelValue) { //构造函数
this.levelValue = levelValue;
}
public int getLevelValue() {
return levelValue;
}
public void setLevelValue(int levelValue) {
this.levelValue = levelValue;
}
}
其实如果从字面意思能理解,那这样也是创建枚举类型。(常见)
public enum Level3 {
LOW,MEDIUM,HIGH;
}
二、枚举类的常用方法
方法演示:
public static void main(String[] args) {
//作比较,LOW在HIGH前面两个,应输出-2
System.out.println(Level3.LOW.compareTo(Level3.HIGH));
//作比较,HIGH在MEDIUM前面一个,应输出1
System.out.println(Level3.HIGH.compareTo(Level3.MEDIUM));
//getname,应输出“MEDIUM”
System.out.println(Level3.MEDIUM.name());
//getDeclaringClass()返回对象
System.out.println(Level3.LOW.getDeclaringClass());
//返回枚举常量的系数,默认从0开始,HIGH为2
System.out.println(Level3.HIGH.ordinal());
//toString()默认返回name,可重写
System.out.println(Level3.LOW.toString());
}
最后一个方法为static方法,所以是用类来调用。返回类对象
//传入类,传入名字,返回枚举常量
Level3 x = Enum.valueOf(Level3.class, "HIGH");
System.out.println(x.toString());
运行结果:
其实以上这些方法还不是特别常用,最常用的将枚举用在switch语句里:
public static void hh(Level3 l){
switch (l){
case LOW:
System.out.println("我是LOW");
break;
case MEDIUM:
System.out.println("我是MEDIUM");
break;
case HIGH:
System.out.println("我是HIGH");
break;
}
}
三、枚举接口
枚举对接口的实现有一个特殊的点:每一个枚举对象都可以有自己独特的对接口的实现。
先演示一般对接口的实现:
eg:先写一个接口
interface lshow{
void show();
}
枚举类中实现接口:
public enum Level3 implements lshow{
LOW,MEDIUM,HIGH;
@Override
public void show() {
System.out.println("枚举接口实现成功!");
}
}
main方法中调用show:
结果:我们发现,不管用HIGH LOW 还是MIDUM调用show 都输出相同内容。那么我们怎么能让他们各自有各自的show实现呢?
我们在枚举中,可以通过在对象后加{}的方法,来逐个实现接口方法:
LOW{
@Override
public void show() {
System.out.println("低级");
}
}, MEDIUM {
@Override
public void show() {
System.out.println("中级");
}
},HIGH {
@Override
public void show() {
System.out.println("高级");
}
}
这样我们再在main中调用show,就有各自的show了。
结果:
四、枚举的注意事项
1、一旦定义了枚举,最好不要妄图修改里面的值,除非修改是必要的。
2、枚举类默认继承的是java.lang.Enum类而不是Object类
3、枚举类不能有子类,因为其枚举类默认被final修饰
4、只能有private构造方法
5、switch中使用枚举时,直接使用常量名,不用携带类名
6、不能定义name属性,因为自带name属性
7、不要为枚举类中的属性提供set方法,不符合枚举最初设计初衷。