参考:https://www.bilibili.com/video/BV1Kb411W75N
枚举类是一种类,它的特点是对象数量有限且确定(对象是写死的)。
当我们需要定义一组常量时(例如四季、周一到周日、12个月等),一般会使用枚举类。
在jdk5.0之后,提供了enum关键字来定义枚举类,用enum关键字定义的枚举类默认继承于 java.lang.Enum 类
// 使用enum关键字定义枚举类 enum Season1 { // 1. 提供当前枚举类的对象,多个对象之间用“,”隔开,末尾对象用“;”结束 SPRING("春天", "春暖花开"), SUMMER("夏天", "夏日炎炎"), AUTUMN("秋天", "秋高气爽"), WINTER("冬天", "冰天雪地"); // 2. 声明Season对象的属性:用 private final 修饰 private final String seasonName; private final String seasonDesc; // 3. 私有化类的构造器,并给对象属性赋值 private Season1(String seasonName, String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; } // 4. 其它诉求:获取枚举类对象的属性 public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } }
Enum类中的常用方法有3个:
/** * 使用enum关键字定义枚举类 * 说明:定义的枚举类默认继承于 java.lang.Enum 类 */ public class SeasonTest1 { public static void main(String[] args) { Season1 summer = Season1.SUMMER; // toString(): System.out.println(summer.toString()); System.out.println("********************************"); // values(): Season1[] values = Season1.values(); for (int i = 0; i < values.length; i++) { System.out.println(values[i]); } // valueOf(String ovjName): 返回枚举类中对象名是objName的对象。 // 如果没有objName的枚举类对象,则抛异常:IllegalArgumentException Season1 winter = Season1.valueOf("WINTER"); // Season1 winter = Season1.valueOf("WINTER1"); System.out.println(winter); } } // 使用enum关键字定义枚举类 enum Season1 { // 1. 提供当前枚举类的对象,多个对象之间用“,”隔开,末尾对象用“;”结束 SPRING("春天", "春暖花开"), SUMMER("夏天", "夏日炎炎"), AUTUMN("秋天", "秋高气爽"), WINTER("冬天", "冰天雪地"); // 2. 声明Season对象的属性:用 private final 修饰 private final String seasonName; private final String seasonDesc; // 3. 私有化类的构造器,并给对象属性赋值 private Season1(String seasonName, String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; } // 4. 其它诉求:获取枚举类对象的属性 public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } }
1、直接在enum类中重写接口中声明的抽象方法,这也是实现接口最惯用的方法,但有个问题是这样实现接口的话,枚举类中的不同对象调用的是同一个方法,调用的结果也都是相同的,如果我想让每个对象调用不同的方法,获得不同的结果,应该怎么办呢?
2、让枚举类中的每个对象分别实现接口中的抽象方法。
/** * 使用enum关键字定义枚举类 * 说明:定义的枚举类默认继承于 java.lang.Enum 类 */ public class SeasonTest1 { public static void main(String[] args) { Season1 summer = Season1.SUMMER; // 遍历Season1枚举类中每个对象的show方法 Season1[] values = Season1.values(); for (int i = 0; i < values.length; i++) { System.out.println(values[i]); values[i].show(); } // 调用WINTER的show方法 winter.show(); } } interface Info { void show(); } // 使用enum关键字定义枚举类 enum Season1 implements Info{ // 1. 提供当前枚举类的对象,多个对象之间用“,”隔开,末尾对象用“;”结束 SPRING("春天", "春暖花开") { @Override public void show() { System.out.println("春天在哪里"); } }, SUMMER("夏天", "夏日炎炎") { @Override public void show() { System.out.println("宁夏"); } }, AUTUMN("秋天", "秋高气爽") { @Override public void show() { System.out.println("秋天不回来"); } }, WINTER("冬天", "冰天雪地") { @Override public void show() { System.out.println("大约在冬季"); } }; // 2. 声明Season对象的属性:用 private final 修饰 private final String seasonName; private final String seasonDesc; // 3. 私有化类的构造器,并给对象属性赋值 private Season1(String seasonName, String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; } // 4. 其它诉求:获取枚举类对象的属性 public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } }