简介
先看一个简单的枚举类型
public enum SeasonEnum { SPRING,SUMMER,FALL,WINTER; }
- enum其实和class地位一样。
- 枚举类默认继承java.lang.Enum而非Object类。
- 枚举类可以继承一个或多个接口。
- 上面的四个季节其实就是SeasonEnum的四个实例,自动被添加public static final修饰,默认调用构造器。不可以再创建新的实例
- 由于枚举类的实例在类内创建,构造器只允许在类内调用,因此必须声明为private。
- 非抽象的枚举类默认被final修饰,不可以被继承。
枚举类也可以有自定义属性和方法(静态与否无妨)。
public enum SeasonEnum { //创建实例,调用构造器(这里要求传入字符串);必须写在第一行 SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天"); //自定义属性;枚举类通常应该设计成不可变类,它的field不应该被改变,这样会更安全 private final String name; //构造器 private SeasonEnum(String name) { this.name = name; } public String getName() { return name; } }
常用方法
- toString(): 继承自Enum类,返回枚举常量(枚举值)名。
SeasonEnum.SPRING.toString() //返回SPRING
- valueOf(): 静态方法,toString()的逆方法,将字符串包装成枚举类。
SeasonEnum season=(SeasonEnum)Enum.valueOf(SeasonEnum.class,"SPRING"); //将season包装为SeasonEnum.SPRING
- values(): 每个枚举类型都包含的静态方法,返回一个包含全部枚举值的数组
SeasonEnum[] values=SeasonEnum.values();
枚举类实现接口
- 与普通类一样,枚举类实现接口的时候如果没有重写所有方法,那这个枚举类就是抽象的,只是不需要显式加上abstract修饰。
public enum Operation {
//枚举值实现抽象方法
PLUS{
@Override
public double eval(double x, double y) {
return x + y;
}
},
TIMES{
@Override
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(10, 2));
System.out.println(Operation.TIMES.eval(10, 2));
}
}
switch语句里的表达式可以是枚举值
case表达式可以直接写枚举值,而不需加入枚举类作为限定。
public class SeasonTest { public void judge(SeasonEnum s) { switch(s) { case SPRING: System.out.println("春天适合踏青。"); break; case SUMMER: System.out.println("夏天要去游泳啦。"); break; case FALL: System.out.println("秋天一定要去旅游哦。"); break; case WINTER: System.out.println("冬天要是下雪就好啦。"); break; } }