Java基础--面向对象(4)

1 阅读2分钟

枚举

1. 什么是枚举

  • 枚举是一个特殊的JavaBean类,这个类的对象是有限个;
  • 使用场景: 订单的状态、月份、星期、游戏角色职业、会议室预约状态、设备状态...

2. 枚举的定义格式

image.png

标准的枚举示例:

public enum OrderState {

    PAYMENT_PENDING("待支付"),
    PROCESSING("处理中"),
    SHIPPED("已发货"),
    OUT_FOR_DELIVERY("已出库"),
    DELIVERED("已送达"),
    CANCELLED("已取消");

    private final String name;

    private OrderState(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
  • 首先public后的class被换成了enum
  • 红字所代表的是枚举项,后面的括号中代表了他所对应的私有化成员变量name的值
  • 在创建对象的时候都采用了有参构造(枚举项),所以就不需要空参构造了;
  • 下为有参构造的例子: 写private的原因是不让外界创建对象,换成public与枚举这一概念相矛盾;
private OrderState(String name) {
        this.name = name;
    }//有参构造
  • 去除setName方法,不需要修改属性值;

所对应的测试类:


public class EnumTest1 {
    public static void main(String[] args) {
        OrderState o1 = OrderState.PAYMENT_PENDING;

        System.out.println(o1.getName());

        switch (o1) {
            case PAYMENT_PENDING:
                System.out.println("待支付");
                break;
            case PROCESSING:
                System.out.println("处理中");
                break;
            case SHIPPED:
                System.out.println("已发货");
                break;
            case OUT_FOR_DELIVERY:
                System.out.println("已出库");
                break;
            case DELIVERED:
                System.out.println("已送达");
                break;
            case CANCELLED:
                System.out.println("已取消");
                break;
        }
    }
}
  • 直接使用枚举类名.枚举项调用即可;
OrderState o1 = OrderState.PAYMENT_PENDING;

输出结果: image.png

3.枚举的注意事项

  • 每一个枚举项,都是该枚举类的对象
  • 枚举项在底层就是常量,默认用public static final修饰(虚拟机自动修饰);
  • 枚举类的第一行上必须是枚举项,枚举项之间用逗号隔开,以分号为结尾;
  • 枚举类的构造方法必须是private修饰(虚拟机自动补充),不让外界创建本类的对象;
  • 编辑器会给枚举类新增两个默认存在的方法:values(),valueOf();

(1)每一个枚举项,都是该枚举类的对象**;**

private OrderState(String name) {
sout(”看看我执行了吗“ + name);
this.name = name; 
}//有参构造

运行时控制台输出:

image.png

  • 这证明在运行OrderState时,是通过构造方法把枚举项创建、以供使用;

(5)编辑器会给枚举类新增两个默认存在的方法:values(),valueOf();

values():表示获取所有的枚举项;

public class EnumTest2 {
    public static void main(String[] args) {
        OrderState[] arr = OrderState.values();
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i].getName());
        }
    }
}

输出结果:

image.png

ValueOf()表示获取一个指定的枚举项

OrderState o1 = OrderState.valueOf("PAYMENT_PENDING");
System.out.println(o1.getName());

输出结果为:待支付