使用enum关键字(和class、interface地位相同)定义枚举类。枚举类是一个特殊的类,它一样可以有自己的成员变量、方法,可以实现一个或多个接口,也可以定义自己的构造器。一个Java源文件中最多只能定义一个public访问权限的枚举类,且该源文件必须和该枚举类的类名相同。
- 使用enum定义的枚举类默认继承java.lang.Enum类,而不是默认继承Object类,因此没距离不能显式继承其他父类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口。
- 使用enum定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类。
枚举类的构造器只能使用private访问符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private修饰符。 - 枚举类的所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远都不能产生实例。列出的所有实例,系统会自动添加public static final修饰。枚举类默认提供values方法,可以遍历所有枚举值。
public enum SeasonEnum
{
SPRING,SUMMER,FALL,WINTER;
}
public class EnumTest
{
public void judge(SeasonEnum s)
{
switch (s)
{ //当switch控制表达式使用枚举类型时,后面case表达式中的值直接使用枚举值的名字,无须添加限定
case SPRING:
System.out.println("春");
break;
case SUMMER:
System.out.println("夏");
break;
case FALL:
System.out.println("秋");
break;
case WINTER:
System.out.println("冬");
break;
}
}
public static void main(String[] args)
{
for(SeasonEnum s; SeasonEnum.values())
System.out.println(s);
new EnumTest().judge(SeasonEnum.WINTER);
}
}
枚举类型的成员变量、方法和构造器
一旦为枚举类型定义了带参数的构造器,列出枚举值时就必须对应传入参数。在枚举类中列出枚举值时,实际上就是调用构造器创建枚举类对象,只是这里无须使用new,也无须显式调用构造器。
public enum Gender
{
//此处的枚举值必须调用对应的构造器来创建
MALE("男"),FEMALE("女");
private final String name;
//枚举类的构造器只能使用private修饰
private Gender(String name) { this.name = name; }
public String getName() { return this.name; }
}
实现接口的枚举类
public interface GenderDesc { void info(); }
public enum Gender implements GenderDesc
{
//此处的枚举值必须调用对应的构造器来创建
MALE("男"),FEMALE("女");
private final String name;
//枚举类的构造器只能使用private修饰
private Gender(String name) { this.name = name; }
public String getName() { return this.name; }
//增加info方法,实现接口必须实现的方法
public void fnfo()
{
System.out.println("这是性别枚举类");
}
}
如果由枚举类来实现接口里的方法,则每个枚举值在调用该方法时都由=有相同的行为。如果需要不同枚举值调用方法呈现不同行为,则需要针对枚举值提供不同的实现。
MALE("男")
{ // 类体
public void info() {System.out.println("这是性别枚举类:男");}
},
MALE("女")
{ // 类体
public void info() {System.out.println("这是性别枚举类:女");}
}
当创建MALE\FEMALE枚举值时,并不是直接创建Gender枚举类的实例,而是相当于创建Gender的匿名子类的实例。这部分代码和匿名内部类语法大致形似,它是枚举类的匿名内部子类。
包含抽象方法的枚举类
枚举类里定义抽象方法时不能使用abstract关键字将枚举类定义成抽象类(因为系统自动为它添加abstract关键字),但因为枚举类需要显式创建枚举值,而不是作为父类,所以定义每个枚举值时必须为抽象方法提供实现,否则编译出错。
public enum Operation
{
PLUS
{
public double eval(double x, double y) { return x + y; }
},
MINUS
{
public double eval(double x, double y) { return x - y; }
},
TIMES
{
public double eval(double x, double y) { return x * y; }
},
DIVIDE
{
public double eval(double x, double y) { return x / y; }
};
// 为枚举类定义一个抽象方法,由不同枚举值提供不同的实现
public abstract double eval(double x, double y);
public static void main(String[] args)
{
System.out.println(Operation.PLUS.eval(5,4));
System.out.println(Operation.MINUS.eval(5,4));
System.out.println(Operation.TIMES.eval(5,4));
System.out.println(Operation.DIVIDE.eval(5,4));
}
}