一个枚举类,可以看成包括它的一些子类(枚举)的一个类,而且枚举类的构造方法只能是私有的,如下面代码以交灯为示例:
1 public class Test { 2 3 public static void main(String[] args) { 4 Trafficlight light = Trafficlight.RED; 5 6 System.out.println(light.time); 7 System.out.println(light.nextLigth()); 8 // ordinal()方法返回枚举声明的顺序 9 System.out.println(light.ordinal()); 10 // values()方法得到所有枚举类型的一个数组 11 for(Trafficlight light1:light.values()){ 12 System.out.println(light1.name()); 13 } 14 15 // valueOf()方法可以把字符串转换成相应的枚举对象 16 System.out.println(light.RED ==light.valueOf("RED")); 17 } 18 19 public enum Trafficlight { 20 GREEN(30) { 21 22 @Override 23 public Trafficlight nextLigth() { 24 return RED; 25 } 26 }, 27 RED(30) { 28 29 @Override 30 public Trafficlight nextLigth() { 31 return YELLOW; 32 } 33 }, 34 YELLOW(10) { 35 36 @Override 37 public Trafficlight nextLigth() { 38 return GREEN; 39 } 40 }; 41 public abstract Trafficlight nextLigth(); 42 43 private int time; 44 45 // 构造方法 46 private Trafficlight(int time) { 47 this.time = time; 48 } 49 50 public int getTime(){ 51 return time; 52 } 53 54 } 55 56 }
代码中,可以看到GREEN,RED,YELLOW,分别是Trafficlight的一个子类,并作为它的成员变量。在Trafficlight有一个抽象方法nextLight(),在子类中是必须要实现的,所以@Override,另外它们也继承了父类的方法,所以可以调用父类的方法 getTiime(),由于父类Trafficlight中声明一个有参数的构造方法覆盖了无参的构造方法,所以构建子类时也必须要加上参数。
代码中light只是相当于一个父类的实例,用它可以得到各个成员变量的子类,调用各种方法,valueOf(String)方法可以将字符串转换成一个枚举。