什么是枚举类
枚举类,就如它的名字一样,这个类里面的属性就是用来枚举的。当某些属性是固定个数的,就可以使用枚举类。比如星期,性别,季节,月份等固定的常量。JAVA将线程的状态也定义成了枚举类(Thread.State)。如下所示:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
可以看到,当定义一组不变的常量,就可以使用枚举类。
使用enum枚举类
使用说明
- 使用enum定义的枚举类默认继承了java.lang.Enum类,因此不能再继承其他类
- 枚举类的构造器只能使用private 权限修饰符,默认不写也是
- 枚举类的所有实例必须在枚举类中显式列出(, 分隔; 结尾)。列出的实例系统会自动添加public static final 修饰
- 枚举类对象的属性不应允许被改动, 所以应该使用private final 修饰
- 枚举类默认重写了toString()方法,但是只返回枚举对象名,可以重写来进行更详细的描述。
- 必须在枚举类的第一行声明枚举类对象
- 若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数
enum Season {
SPRING("春天", "天街小雨润如酥"),
SUMMER("夏天", "小荷才露尖尖角"),
AUTUMN("秋天", "霜叶红于二月花"),
WINTER("冬天", "雪后春光欲到梅");
private final String name;
private final String desc;
Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
@Override
public String toString() {
return name + ":" + desc;
}
}
枚举类的主要方法
- values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
- toString():返回当前枚举类对象常量的名称
public class EnumDemo {
public static void main(String[] args) {
Season[] values = Season.values(); //获取枚举类的对象数组
for (Season s : values) {
System.out.println(s); // 遍历输出
}
}
}
枚举类可以实现接口
- 和普通Java 类一样,枚举类可以实现一个或多个接口
- 若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。
- 若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 则可以让每个枚举值分别来实现该方法
public class EnumDemo {
public static void main(String[] args) {
Season[] values = Season.values();
for (Season s : values) {
s.show();
}
}
}
interface Info {
void show();
}
enum Season implements Info {
// 每个枚举实例通过匿名内部类的方式分别实现接口的方法
SPRING("春天", "天街小雨润如酥") {
@Override
public void show() {
System.out.println("SPRING");
}
},
SUMMER("夏天", "小荷才露尖尖角") {
@Override
public void show() {
System.out.println("SUMMER");
}
},
AUTUMN("秋天", "霜叶红于二月花") {
@Override
public void show() {
System.out.println("AUTUMN");
}
},
WINTER("冬天", "雪后春光欲到梅") {
@Override
public void show() {
System.out.println("WINTER");
}
};
private final String name;
private final String desc;
Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
@Override
public String toString() {
return name + ":" + desc;
}
}
结果如下: