关于枚举类(enum)
枚举类与普通类的不同之处
- 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类,而不是 Object 类,因此枚举类不能显式继承其他普通父类。
- java.lang.Enum 类实现了 java.lang.Serializable 和 java.lang.Comparable 两个接口。
- 使用enum定义、非抽象的枚举类默认用final修饰,因此枚举类无法派生子类
- 枚举类的构造器只能用private修饰,即使省略,也只能用private
- 枚举类的所有实例必须在枚举类的第一行显式指出,否则这个枚举类永远都不能产生实例。列出的这些类,系统会自动添加 public static final。
- 枚举类默认提供了一个values()方法,可以方便的遍历所有的枚举值。
public enum Season {
SPRING,SUMMER,AUTOMN,WINTER;
}
class EnumTest{
static void judge(Season season){
//switch语句里的表达式可以是枚举值
switch (season){
case AUTOMN:
System.out.println("秋");
break;
case SPRING:
System.out.println("春");
break;
case SUMMER:
System.out.println("夏");
break;
case WINTER:
System.out.println("冬");
break;
}
}
public static void main(String[] args) {
for (Season s :Season.values()) {
System.out.println(s); //SPRING SUMMER AUTOMN WINTER
}
EnumTest.judge(Season.AUTOMN); //秋
}
}
枚举类的成员变量、方法和构造器
成员变量:和普通类一样。
方法:和普通类一样。
构造器:只能用private 修饰,也就是说,只能在枚举类中第一行创建实例时用。
实现接口的枚举类:
interface GenderDesc{
void setName();
}
public enum Gender implements GenderDesc{
//花括号部分实际上是一个类体部分,和匿名内部类差不多,
//这样就以不同的行为方式实现了接口,并且创建出枚举类的实例。
MALE("男"){
@Override
public void setName() {
System.out.println("男");
}
},
FEMALE("女") {
@Override
public void setName() {
System.out.println("女");
}
};
//枚举类通常应该设计成不可变类,它的成员变量不应该被改变
//所以,枚举类的成员变量都应该使用private final修饰
private final String name;
Gender(String name){
this.name = name;
}
}
包含抽象方法的枚举类:
//尽管枚举类中含有抽象方法,但是不能为枚举类添加abstract关键字,
//系统会自动为其添加,只需要每个枚举类实例提供抽象方法的实现就好。
public enum Gender {
//花括号部分实际上是一个类体部分,和匿名内部类差不多,
//这样就以不同的行为方式实现了抽象方法,并且创建出枚举类的实例。
MALE("男"){
@Override
public void setName() {
System.out.println("男");
}
},
FEMALE("女") {
@Override
public void setName() {
System.out.println("女");
}
};
//枚举类通常应该设计成不可变类,它的成员变量不应该被改变
//所以,枚举类的成员变量都应该使用private final修饰
private final String name;
abstract void setName();
Gender(String name){
this.name = name;
}
}