枚举类的理解:
枚举类型本质上也是一种类,只不过是这个类的对象是有限的、固定的几个,不能让用户随意创建
举例
星期:Monday(星期一)...... Sunday(星期天)
性别:Man(男)、Woman(女)
月份:January(一月)...... December(十二月)
季节:Spring(春季)...... Winter(冬季)
三原色:red(红色)、green(绿色)、blue(蓝色)
支付方式:Cash现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡)
就职状态:Busy(忙碌)、Free(空闲)、Vocation(休假)、DIsmission(离职
订单状态:Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配货)、Delivered(已发货)、Checked(已收货)
线程状态:创建、就绪、、运行、阻塞、死亡
开发中的建议:
开发中,如果针对于某个类,其实咧是确定个数的。则推荐将此类声明为枚举类。
如果枚举类的实例只有一个,则可以看作是单例的实现方法
jdk5.0之前 :
public class SeasonTest { public static void main(String[] args) { System.out.println(Season.SPRING.getSeasonName() + " " + Season.SPRING.getSeasonDesc()); } } //jdk5.0之前定义枚举类的方式 class Season{ //2.声明当前类的对象的实例变量,需要用private final来修饰 private final String seasonName; private final String seasonDesc; //1.私有化类的构造器 private Season(String seasonName,String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; } //3.提供实例变量的get方法 public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } //4.创建当前类的实例,需要用public static final来修饰 public static final Season SPRING = new Season("春天","春暖花开"); public static final Season SUMMER = new Season("夏天","炎炎夏日"); public static final Season AUTUMN = new Season("秋天","秋高气爽"); public static final Season WINTER = new Season("冬天","凛冬将至"); @Override public String toString() { return "Season{" + "seasonName='" + seasonName + '\'' + ", seasonDesc='" + seasonDesc + '\'' + '}'; } }
jdk5.0中 :
public class SeasonTest1 { public static void main(String[] args) { System.out.println(Season1.SPRING.getClass()); System.out.println(Season1.SUMMER.getClass().getSuperclass()); } } enum Season1{ //1.必须在枚举类的开头声明多个对象。对象之间用“,”隔开 SPRING("春天","春暖花开"), SUMMER("夏天","炎炎夏日"), AUTUMN("秋天","秋高气爽"), WINTER("冬天","凛冬将至"); private final String seasonName; private final String seasonDesc; private Season1(String seasonName,String seasonDesc){ this.seasonName = seasonName; this.seasonDesc = seasonDesc; } public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } @Override public String toString() { return "Season1{" + "seasonName='" + seasonName + '\'' + ", seasonDesc='" + seasonDesc + '\'' + '}'; } }
Enum中的常用方法:
4.1 使用Enum关键字定义的枚举类,默认其父类是java.lang.Enum类
使用Enum关键字定义的枚举类,不要再显式的定义以其父类。否则报错
4.2 熟悉Enum类中常用的方法:
String toString():默认返回的是常量名(对象名),可以继续手动重写该方法
static 枚举类型[ ] values():返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值,是一个静态方法
static 枚举类型 valuesOf(String name):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如果不是,会有运行时异常:IllegalArgumentException
String name():得到当前枚举常量的名称。建议优先使用toStirng()
int ordinal():返回当前枚举常量的次序号,默认从0开始
枚举类实现接口的操作:
情况1:枚举类实现接口,在枚举类中重写接口中的抽象方法。当通过不同的枚举类对象调用此方法时,执行的是同一个方法
interface Info{ void show(); } enum Season1 implements Info{ //1.必须在枚举类的开头声明多个对象。对象之间用“,”隔开 SPRING("春天","春暖花开"), SUMMER("夏天","炎炎夏日"), AUTUMN("秋天","秋高气爽"), WINTER("冬天","凛冬将至"); private final String seasonName; private final String seasonDesc; private Season1(String seasonName,String seasonDesc){ this.seasonName = seasonName; this.seasonDesc = seasonDesc; } public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } @Override public String toString() { return "Season1{" + "seasonName='" + seasonName + '\'' + ", seasonDesc='" + seasonDesc + '\'' + '}'; } @Override public void show() { System.out.println("这是一个季节"); } }
情况2:让枚举类的每一个对象重写接口中的抽象方法。当通过不同的枚举类对象调用此方法时,执行的是不同的实现方法
public class SeasonTest2 { public static void main(String[] args) { Season2[] values = Season2.values(); for(int i = 0; i < values.length; i++){ values[i].show(); } } } interface Info1{ void show(); } enum Season2 implements Info1{ //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("冬天里的一把火"); } }; private final String seasonName; private final String seasonDesc; private Season2(String seasonName,String seasonDesc){ this.seasonName = seasonName; this.seasonDesc = seasonDesc; } public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } @Override public String toString() { return "Season1{" + "seasonName='" + seasonName + '\'' + ", seasonDesc='" + seasonDesc + '\'' + '}'; } }