介绍:在某些情况下,一个类的对象是有限且固定的,比如季节类,只有四个对象:春夏秋冬。这种实例有限而且固定的类,被称为枚举类。在JDK 5.0及以后,可以使用enum关键字定义枚举类,并且默认继承于java.lang.Enum类。
一、使用enum关键字定义枚举类:
1. 枚举类入门:最简单的枚举类可以仅仅定义枚举值,若需要使用该枚举类的某个实例,可以直接通过 枚举类名.枚举值 来调用。如下:
enum Season{ SPRING,SUMMER,AUTUMN,WINTER; } Season s = Season.SPRING; System.out.println(s.toString());//SPRING
2. 枚举类进阶:枚举类是一种特殊的类,因此也可以定义成员变量、方法和构造器。
- 提供当前枚举类的对象,多个对象之间采用逗号隔开,使用分号结束;
- 声明Season对象的属性,使用private final修饰;
- 私有化构造器,并为对象属性赋值;
- 其他诉求:获取枚举类对象的属性。
在枚举类中列出枚举值时,实际上就是调用构造器创建枚举类对象,只是这里无须使用new关键字,也无须显式调用构造器。前面列出枚举值时无须传入参数,甚至无须使用括号,仅仅是因为前面的枚举类中包含无参数的构造器。
1 enum Season{ 2 SPRING("春天","这是春天"), 3 SUMMER("夏天","这是夏天"), 4 AUTUMN("秋天","这是秋天"), 5 WINTER("冬天","这是冬天"); 6 7 private final String seasonName; 8 private final String seasonDesc; 9 10 private Season(String seasonName,String seasonDesc){ 11 this.seasonName = seasonName; 12 this.seasonDesc = seasonDesc; 13 } 14 15 public String getSeasonName() { 16 return seasonName; 17 } 18 19 public String getSeasonDesc() { 20 return seasonDesc; 21 } 22 }
3. 实现接口的枚举类:
1 interface Info{ 2 void show(); 3 } 4 5 enum Season implements Info{ 6 SPRING("春天","这是春天"), 7 SUMMER("夏天","这是夏天"), 8 AUTUMN("秋天","这是秋天"), 9 WINTER("冬天","这是冬天"); 10 11 private final String seasonName; 12 private final String seasonDesc; 13 14 private Season(String seasonName,String seasonDesc){ 15 this.seasonName = seasonName; 16 this.seasonDesc = seasonDesc; 17 } 18 19 public String getSeasonName() { 20 return seasonName; 21 } 22 23 public String getSeasonDesc() { 24 return seasonDesc; 25 } 26 27 @Override 28 public void show() { 29 System.out.println("这是一个季节"); 30 } 31 } 32 33 Season s = Season.SPRING; 34 System.out.println(s.toString()); 35 s.show(); 36 37 输出: 38 SPRING 39 这是一个季节
也可以将接口中的抽象方法放在枚举值中来实现,如下:
interface Info{ void show(); } enum Season implements Info{ SPRING("春天","这是春天"){ public void show() { System.out.println("这是春天"); } }, SUMMER("夏天","这是夏天"){ public void show() { System.out.println("这是夏天"); } }, AUTUMN("秋天","这是秋天"){ public void show() { System.out.println("这是秋天"); } }, WINTER("冬天","这是冬天"){ public void show() { System.out.println("这是冬天"); } }; private final String seasonName; private final String seasonDesc; private Season(String seasonName,String seasonDesc){ this.seasonName = seasonName; this.seasonDesc = seasonDesc; } public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } } Season s = Season.SPRING; System.out.println(s.toString()); s.show(); 输出: SPRING 这是春天