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