枚举Enumeration

枚举

它的对象(具体值)是固定的时(如:性别、季节等)不会更多,普通类不能体现它们是固定的若干个对象。

枚举(enumeration,简写enum)是一组常量的集合;可以理解为特殊的类,里面仅包含一组有限的特定对象。

自定义实现枚举

  1. 构造器私有化,防止直接实例化对象
  2. 去掉set方法,防止属性被修改;保证对象只读
  3. 对枚举对象和属性使用final+static一起修饰,实现底层优化
  4. 枚举对象名通常使用全部大写,常量的命名规范
自定义枚举实现四季
public class Enumeration {
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
        System.out.println(Season.AUTUMN);

    }
}
class Season{
    private String name;
    private String desc;

    public final static Season SPRING =new Season("春天","潮湿");
    public final static Season SUMMER =new Season("夏天","炎热");
    public final static Season AUTUMN =new Season("秋天","凉爽");
    public final static Season WINTER =new Season("冬天","寒冷");
    // 在Season内部直接创建固定对象
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

enum关键字实现枚举

  1. 使用enum关键字替代class
  2. public final static Season SPRING =new Season("春天","潮湿");换成(等价于) SPRING("春天","潮湿")

  3. 如果有多个常量(对象),用","隔开即可
  4. 使用enum实现枚举要把定义常量对象写在最前
  5. 如果使用无参构造器可以省略()。
enum关键字实现枚举
public class Enumeration {
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
        System.out.println(Season.AUTUMN);

    }
}
// enum关键字枚举
enum Season{
    // 定义常量对象
    SPRING("春天","潮湿"),
    SUMMER("夏天","炎热"),
    //    OTHER,// 调用无参构造器
    AUTUMN("秋天","凉爽"),
    WINTER("冬天","寒冷");

    private String name;
    private String desc;

    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

   /* Season() {    // 无参构造器
    }*/

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

图 1.编译与反编译

enum常用方法

  1. toString:Enum类已经重写,返回的是当前对象
  2. name:返回的是当前对象名(常量名),子类中不能重写
  3. ordinal:返回当前对象的位置号,
  4. values返回当前枚举类中所有的常量
  5. ValuesOf:把字符串转成枚举对象,要求字符串必须为已有的常量名,否则提示异常
  6. compareTo:比较两个枚举常量(比较编号)。
枚举类的常用方法
 public class EnumMethod {
    public static void main(String[] args) {
        Season autumn=Season.AUTUMN;
        // 输出枚举对象名
        System.out.println(autumn.name());
        // 输出该枚举对象的次序/编号(从0开始)
        System.out.println(autumn.ordinal());
        // values()从反编译可以查看该方法;返回所有定义的枚举对象
       for (Season season:Season.values()){// 增强for循环;遍历取出
           System.out.println(season);
       }
       //valueOf:把字符串转成枚举对象,要求字符串必须为已有的常量名,否则提示异常
        //根据输入的"AUTUMN"参数到Season的枚举对象去查找,找到就返回,没有就报错
        Season autumn1=Season.valueOf("AUTUMN");
        System.out.println("autumn1="+autumn1);
        System.out.println(Season.AUTUMN.compareTo(Season.WINTER));
        System.out.println(autumn1 == autumn);  //判断两个对象是否为同一个
    }
}

enum实现接口

使用enum关键字后就不能继承其他类;因为它有隐式继承了Enum,同时Java是单继承机制。

枚举类和普通类一样可以实现接口。形式:enum 类名 implements 接口1,接口2{}

查看代码
public class EnumMethod {
    public static void main(String[] args) {
        System.out.println("所有星期信息如下");
        for (Week week:Week.values()){
            System.out.println(week.getName());
        }
    }
}

enum Week{      // enum Week extends A{  会提示异常。
    ONE("星期一"),
    TWO("星期二"),
    THREE("星期三"),
    FIRE("星期四"),
    FIVE("星期五"),
    SIX("星期六"),
    SEVEN("星期日");

    private   String name;

    Week(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

 

posted @ 2024-04-12 15:55  Dr丶云幕  阅读(29)  评论(0编辑  收藏  举报