1、什么时候用枚举
如果类的对象是有限个,确定的,那么我们就可以用枚举类。枚举理解成一一列举。
比如支付状态和订单状态:
支付方式:cash(现金) WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡)
订单状态:Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配货)、Delivered(已发货)、
Returen(退货)、Checked(已确认)
当需要定义一组常量时,强烈建议使用枚举类
jdk中用枚举的例子:
线程的状态:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
2、自定义枚举类
jdk1.5之前我们需要自己定义枚举类:
(1)声明Season对象的属性:private final 修饰
(2)构造器私有化 因为枚举类的对象是有限的,确定的,如果是公有的就违背了这一原则
(3)提供当前枚举类的多个对象:public static final
class Season{
//1、 声明Season对象的属性:private final 修饰
private final String seasonName;
// 2、 构造器私有化 因为枚举类的对象是有限的,确定的,如果是公有的就违背了这一原则
private Season(String seasonName){
this.seasonName=seasonName;
}
// 3、提供当前枚举类的多个对象: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("冬天");
public String getSeasonName() {
return seasonName;
}
@Override
public String toString() {
return seasonName;
}
}
/**
* 自定义枚举类
*/
public class SeasonTest {
public static void main(String[] args) {
Season spring =Season.SPRING;
System.out.println(spring);
}
}
运行结果 春天
3、使用enum枚举类
用关键字enum来进行定义枚举类
public enum Season {
// 1、提供当前枚举类的对象,多个对象用,隔开,末尾用;
SPRING("春天"),
SUMMER("夏天"),
AUTUMN("秋天"),
WINTER("冬天");
// 2、声明season对象的属性:private final修饰
private final String seasonName;
// 3、 构造器私有化 因为枚举类的对象是有限的,确定的,如果是公有的就违背了这一原则
Season(String seasonName) {
this.seasonName = seasonName;
}
public String getSeasonName() {
return seasonName;
}
}
public class Main {
public static void main(String[] args) {
// 执行结果为SPRING,而不是一个地址值,打印一个对象默认调用的是这个对象的toString,
//说明它的tostring被重写了,说明它的父类不是Object
System.out.println(Season.SPRING);
// 执行结果是class java.lang.Enum 说明它的父类是Enum
System.out.println(Season.class.getSuperclass());
}
}
执行结果
从上面分析的来看,枚举的父类是Enum
4、 Enum的常用方法
(1)toString(): 返回当前枚举类 对象常量的名字
(2)values(): 返回枚举类型的对象数组。该方法可以很方便的遍历所有的枚举值。
Season[] values = Season.values();
for (Season value : values) {
System.out.println(value);
}
打印结果:
(3)valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的名字。如不是,会有运行时异常:IllegalArgumentException。
eg:
Season mo = Season.valueOf("mo");
报错:
Season winter=Season.valueOf("WINTER");
System.out.println(winter);
输出结果:WINTER
5、枚举类实现接口
主要展示让枚举类的对象分别展示接口中的抽象方法
interface Info{
void show();
}
public enum Season implements Info{
// 1、提供当前枚举类的对象,多个对象用,隔开,末尾用;
SPRING("春天"){
@Override
public void show() {
System.out.println("春天在哪里");
}
},
SUMMER("夏天"){
@Override
public void show() {
System.out.println("夏天在哪里");
}
},
AUTUMN("秋天"){
@Override
public void show() {
}
},
WINTER("冬天"){
@Override
public void show() {
}
};