Java枚举基础

2022-07-20  本文已影响0人  Tinyspot

1. 枚举

枚举是一个引用类型
枚举是一个规定了取值范围的数据类型

1.1 示例

定义枚举使用 enum 关键字

  1. 枚举中必须包含常量,也可以包含属性、方法、私有构造方法
  2. 枚举常量必须放在前面,多个常量之前使用逗号隔开,最后的分号可写可不写
public enum SeasonEnum {
    SPRING("spring", "春天"),
    SUMMER,
    AUTUMN,
    WINTER;

    private String code;
    private String name;

    // 构造方法是 private
    SeasonEnum() {
    }
    SeasonEnum(String code, String name) {
        this.code = code;
        this.name = name;
    }
}

枚举成员默认是final、public、static (可使用 SeasonEnum.SPRING 方式调用枚举成员)
每一个枚举类型成员都可以看作是枚举类的实例 (SeasonEnum.SPRING的类型也是SeasonEnum)

反编译看看 javap -p SeasonEnum.class

public final class SeasonEnum extends java.lang.Enum {
  public static final SeasonEnum SPRING;
  public static final SeasonEnum SUMMER;
  public static final SeasonEnum AUTUMN;
  public static final SeasonEnum WINTER;
  // 编译器添加的 values() 和 valueOf(String)
  public static SeasonEnum[] values();
  public static SeasonEnum valueOf(java.lang.String);
  static {};
}
  1. 枚举是 final 类型,无法被继承
  2. 所有用 enum 修饰的类继承自 Enum,由于 Java 的单继承,enum 类不能再继承其他类,但可以实现多接口

1.2 枚举与switch

public static void main(String[] args) {
    // SeasonEnum.SPRING 看上去像是一个类,这里很容易混淆,实际是一个对象
    SeasonEnum seasonEnum = SeasonEnum.SPRING;
    switch (seasonEnum) {
        case SPRING:
            break;
        case AUTUMN:
            break;
        case SUMMER:
            break;
        case WINTER:
            break;
        default:
            System.out.println();
    }
}

1.3 枚举实现接口

// 枚举类里不写属性,通过接口里的默认方法来访问mei ju
public enum SeasonEnum {
    SPRING("spring", "春天"),
    SUMMER,
    AUTUMN,
    WINTER;
    
    SeasonEnum() {
    }
    SeasonEnum(String code, String name) {
    }
}

2. 枚举的本质

  1. 枚举是一个 final 类,并继承 Enum 抽象类
  2. 枚举中常量是当前类型的静态常量
public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable {
    // Returns the name of this enum constant,
    public final String name() {
        return name;
    }
}

3. 数据结构

3.1 EnumSet

EnumSet.png

3.2 EnumMap

image.png

References

上一篇 下一篇

猜你喜欢

热点阅读