枚举类
枚举类本质上也是一个类,不过对比普通的类枚举类有自己的一些特点。
1.使用enum定义的枚举类默认继承于java.lang.Enum,所以自定义的枚举类不能显式的继承其他类。
2.使用enum定义的非抽象的枚举类,默认使用final修饰,也就是说它不能有子类。
3.枚举类的构造器只能用private修饰,不显式指出的话,默认也为private,也就是说枚举类不允许外部创建实例。
4.枚举类的所有实例必须在枚举类的第一行显式列出,并且这些实例默认被public static final修饰,也就说实例一旦确定就不可变,并且可通过枚举类名直接获取。
几个常用的枚举类型的方法
返回类型 | 方法名称 | 说明 |
---|---|---|
enumType[] | values() | 返回枚举类型的所有实例 |
int | compareTo(E o) | 与指定枚举对象的比顺序 |
String | name() | 返回此枚举常量的名称 |
int | ordinal() | 返回枚举常量的索引值 |
String | toString() | 返回枚举常量的名称 |
static< T extends Enum < T>> T | valueOf(Class< T > enumType, String name) | 返回指定名称的指定枚举类型的枚举常量。 |
一个超级简单的枚举类:
enum Season {
SPRING, SUMMER, FALL, WINTER;
}
下面是枚举类的一些用法:
1.在列举枚举实例的时候,可以像构造器传参(前提是有带参数的构造器)
enum Season {
SPRING("春天"), SUMMER("夏天"), FALL("秋天"), WINTER("冬天");
private String dec;
private Season(String dec) {
this.dec = dec;
}
public void getDec() {
System.out.println(dec);
}
}
2.枚举类实现接口
interface Dec {
void getDec();
}
可以这样实现:(所有实例同一行为)
enum Season implements Dec {
SPRING("春天"), SUMMER("夏天"), FALL("秋天"), WINTER("冬天");
private String dec;
private Season(String dec) {
this.dec = dec;
}
public void getDec() {
System.out.println(dec);
}
}
也可以这样:(不同实例不同行为)
enum Season implements Dec {
SPRING("春天") {
public void getDec() {
System.out.println("111");
}
},
SUMMER("夏天"){
public void getDec() {
System.out.println("222");
}
},
FALL("秋天"){
public void getDec() {
System.out.println("333");
}
},
WINTER("冬天"){
public void getDec() {
System.out.println("444");
}
};
private String dec;
private Season(String dec) {
this.dec = dec;
}
}
3.枚举类定义抽象方法
enum Season {
SPRING("春天") {
public void getDec() {
System.out.println("111");
}
},
SUMMER("夏天"){
public void getDec() {
System.out.println("222");
}
},
FALL("秋天"){
public void getDec() {
System.out.println("333");
}
},
WINTER("冬天"){
public void getDec() {
System.out.println("444");
}
};
private String dec;
private Season(String dec) {
this.dec = dec;
}
public abstract void getDec();
}
4.配合switch使用
public void judge(Season s) {
switch (s) {
case SPRING: //不需要用Season.SPRING
System.out.println("春天...");
break;
case SUMMER:
System.out.println("夏天...");
break;
case FALL:
System.out.println("秋天...");
break;
case WINTER:
System.out.println("冬天...");
break;
}
}