枚举(JDK 1.5才有)
- 用于代表【实例已经固定】的类,而且定义时就必须在【第一行】创建,并列出来。
[修饰符] enum 枚举名 implements 接口1, 接口2..., 接口N {
//N个固定实例列表————而是调用相应的构造器创建实例。
————如果枚举类是抽象的二,必须创建N个匿名内部类的实例。
//零个~N个成员变量(Field)定义
//零个~N个方法定义
//初始化块
//内部类、接口、枚举
}
- 修饰符可以是 public | 省略、abstract | final(必须出现一个)
所有的枚举都有一个values()方法,该方法返回所有的枚举实例
public enum Season {
//下面这4个实例,相当于是public static final修饰的Field
SPRING(), SUMMER(), FALL(), WINTER();
public static void main(String[] args) {
for (Season s : Season.values() ) {
System.out.println(s);
}
Season.info(FALL);
}
public static void info(Season s) {
//switch表达式必须是byte | short | char | int | String(JDK 7) | 枚举
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;
}
}
}
- 有了枚举以后,它的实例已经创建出来了,不允许用户创建实例,可以直接使用它的实例。
- 枚举类可以有Field、方法、构造器(只能是private修饰)、初始化块
列出枚举值,并不是简单地定义几个枚举值的变量名。而是调用枚举类的构造器来创建相应的实例。
包含抽象方法的枚举类
package day09;
//模拟一个算术运算
public enum Operation {
// 列出所有枚举值——也就是该枚举类的所有可能的实例
// 但实际上是调用相应的构造器来创建枚举实例
// 还需要立即创建匿名内部类的实例
//PLUS = new Operation()
PLUS(){
public double eval(double x, double y) {
return x + y;
}
},
SUB(){
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;
}
};
//如果枚举里已经有了抽象方法,该枚举类默认就有abstract
//此时枚举类没有final修饰
public abstract double eval(double x, double y);
public static void main(String[] args) {
System.out.println(Operation.TIMES.eval(2.3, 1.5));
}
}
枚举可以实现接口
1、实现接口,并直接实现所有的抽象方法。此时枚举类就不再是抽象枚举了。
interface Directionable {
void pointDirection();
}
public enum Orientation implements Directionable{
EAST, SOUTH, WEST, NORTH;
@Override
public void pointDirection() {
System.out.println("指向:" + this);
}
}
2、实现接口,但并不直接实现抽象方法。此时枚举类就只能是抽象枚举。——就与上一个知识点相同了。
interface Directionable2 {
void pointDirection2();
}
public enum Orientation2 implements Directionable2{
EAST(){
public void pointDirection2() {
System.out.println("指向东方");
}
},
SOUTH(){
public void pointDirection2() {
System.out.println("指向南方");
}
},
WEST(){
public void pointDirection2() {
System.out.println("指向西方");
}
},
NORTH(){
public void pointDirection2() {
System.out.println("指向北方");
}
};
public static void main(String[] args) {
Orientation2.WEST.pointDirection2();
}
}