JAVA 枚举


一、枚举

说明:即把具体的对象一个一个的列举出来的类就称为枚举类

  • 枚举是一组常量集合(enumeration)
  • 里面只包含了一组有限的特定的对象

1.枚举的实现

1.1用户自定义的实现

步骤

  1. 不需要提供setXxx方法,因为枚举对象值通常为只读
  2. 对枚举对象/属性使用 final + static 共同修饰,实现底层优化
  3. 枚举对象名通常使用全部大写,常量命名规范
  4. 枚举对象根据需要,也可以有多个属性

小结:进行自定义类实现枚举

  1. 构造器私有化
  2. 本类创建一组对象
  3. 对外暴露对象
  4. 可以提供get方法,但不要提供set
package com.hspedu.enum_;

/**
 * @author DL5O
 * @version 1.0
 */
public class Enumeration02 {
    public static void main(String[] args) {
        System.out.println(Season_.SPRING);
        System.out.println(Season_.SUMMER);
        System.out.println(Season_.AUTUMN);
        System.out.println(Season_.WINTER);

    }
}


/*
    演示自定义枚举实现
 */
class Season_{
    private String name;
    private String desc;//描述

    //1.将构造器私有化,目的防止直接new
    //2.去掉set相关的方法,目的防止属性被修改
    //3.在Season_内部,创建固定的对象
    //拥有固定的四个对象
    //优化一下加入final关键字,让他为常量
    public final static Season_ SPRING = new Season_("春天", "温暖");
    public final static Season_ WINTER = new Season_("冬天", "寒冷");
    public final static Season_ AUTUMN = new Season_("秋天", "凉爽");
    public final static Season_ SUMMER = new 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 + '\'' +
                '}';
    }
}


1.2使用enum关键字实现枚举

  1. 当我们使用 enum 关键字开发一个枚举类时,默认会继承 Enum 类, 而且是一个final类

    image-20220221164142110

  2. 传统的 public static final Season2 SPRING = new Season2("春天", "温暖"); 简化成 SPRING("春天", "温暖"), 这里必须知道,它调用的是哪个构造器

  3. 如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略

  4. 当有多个枚举对象时,使用,间隔,最后有一个分号结尾

  5. 枚举对象必须放在枚举类的行首

package com.hspedu.enum_;

/**
 * @author DL5O
 * @version 1.0
 */
public class Enumeration03 {
    public static void main(String[] args) {
        System.out.println(Season2.SPRING);
        System.out.println(Season2.SUMMER);
    }
}

enum Season2{

    //使用enum 来实现枚举类
    //1. 使用关键字 enum 替代 class
    //2. public final static Season_ SPRING = new Season_("春天", "温暖");
    //   直接使用 SPRING("春天","温暖"); 进行替代 常量名(实参列表) 等价了前面这句话
    //3. 如果有多个常量(对象),使用 "," 间隔即可
    //4. 如果使用enum 来实现枚举,要求将定义常量写在最前面
    //5. 如果我们使用的是无参构造器,创建常量对象,则可以省略()
    SPRING("春天","温暖"), WINTER("冬天","寒冷"),
    AUTUMN("秋天","凉爽"),SUMMER("夏天","炎热"),
    What;


    private String name;
    private String desc;//描述

    private Season2() {
    }

    private Season2(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 + '\'' +
                '}';
    }
}


2.Enum成员方法

Enum成员方法

  1. toString:Enum 类已经重写过了,返回的是当前对象 名,子类可以重写该方法,用于返回对象的属性信息

  2. name:返回当前对象名(常量名),子类中不能重写

  3. ordinal:返回当前对象的位置号,默认从 0 开始

  4. values:返回当前枚举类中所有的常量

  5. valueOf:将字符串转换成枚举对象,要求字符串必须 为已有的常量名,否则报异常!

  6. compareTo:比较两个枚举常量,比较的就是编号!

package com.hspedu.enum_;

/**
 * @author DL5O
 * @version 1.0
 * 演示Enum类的各种方法的使用
 */
public class EnumExercise {
    public static void main(String[] args) {
        //使用Season3 枚举类,来演示各种方法
        Season3 autumn = Season3.AUTUMN;
        //name 得到枚举对象的名称
        System.out.println(autumn.name());//AUTUMN

        //ordinal()输出的是该枚举对象的次序,从0开始编号的
        //因此autumn是第三个,因此输出2
        System.out.println("序号:"+autumn.ordinal());//2,编号

        //values,返回一个数组就Season2[],
        //含有定义的所有枚举对象
        Season3 [] values = Season3.values();
        System.out.println("====遍历取出枚举对象(增强for)====");
        for (Season3 season:values){//整强for循环
            System.out.println(season);
        }

        /*
        补充增强for循环
        int[] nums = {1,4,6};
        //传统写法
        System.out.println("====普通for循环====");
        for (int i = 0; i < nums.length; i++) {
            System.out.println(nums[i]);
        }

        //增强for循环
        System.out.println("====增强for循环====");
        for (int i : nums) {
            //执行流程,依次从数组nums中取出数据,赋给i,
            //如果取出完毕,则退出for循环
            System.out.println("i=" + i);
        }
        */

        // valueOf:将字符串转换成枚举对象,要求字符串必须为已有的常量名,
        // 否则报异常!
        //1. 根据你输入的 "AUTUMN" 到Season3的枚举对象中去找到
        //2. 如果找到了就返回,没有找到就报错
        Season3 autumn1= Season3.valueOf("AUTUMN");
        System.out.println("autumn1=" + autumn1);
        System.out.println(autumn == autumn1);


        //compareTo
        //1.就是把AUTUMN的编号和SUMMER对象的编号进行比较
        //2.用AUTUMN的编号(2) - SUMMER的编号(3) = -1
        System.out.println(Season3.AUTUMN.compareTo(Season3.SUMMER));//-1
        System.out.println(Season3.SUMMER.compareTo(Season3.AUTUMN));//1
    }
}

enum Season3 {

    //使用enum 来实现枚举类
    //1. 使用关键字 enum 替代 class
    //2. public final static Season_ SPRING = new Season_("春天", "温暖");
    //   直接使用 SPRING("春天","温暖"); 进行替代 常量名(实参列表) 等价了前面这句话
    //3. 如果有多个常量(对象),使用 "," 间隔即可
    //4. 如果使用enum 来实现枚举,要求将定义常量写在最前面
    //5. 如果我们使用的是无参构造器,创建常量对象,则可以省略()
    SPRING("春天", "温暖"), WINTER("冬天", "寒冷"),
    AUTUMN("秋天", "凉爽"), SUMMER("夏天", "炎热");


    private String name;
    private String desc;//描述


    private Season3(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 "Season3{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

练习

声明 Week 枚举类,其中包含星期一至星期日的定义; MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY,

package com.hspedu.enum_;

/**
 * @author DL5O
 * @version 1.0
 */
public class EnumExercise02 {
    public static void main(String[] args) {
        Week[] week = Week.values();
        System.out.println("==所有信息如下==");
        for (Week day : week) {
            System.out.println(day);
        }
    }
}

enum Week{

    MONDAY("星期一"),TUESDAY("星期二"),WEDNESDAY("星期三"),
    THURSDAY("星期四"),FRIDAY("星期五"),SATURDAY("星期六"),
    SUNDAY("星期日");
    private String day;

    private Week(String day) {
        this.day = day;
    }

    public String getDay() {
        return day;
    }

    @Override
    public String toString() {
        return day;
    }
}

3.使用细节和注意事项

  1. 使用 enum 关键字后,就不能再继承其它类了,因为 enum 会隐式继承 Enum,而 Java 是单继承继承

  2. 枚举类和普通类一样,可以实现接口,如下形式

    enum 类名 implements 接口1,接口2{
        
    }
    
    package com.hspedu.enum_;
    
    /**
     * @author DL5O
     * @version 1.0
     */
    public class EnumDetail {
        public static void main(String[] args) {
            Music.CLASSICMUSIC.Playing();
        }
    }
    
    class A{
    
    }
    //1.使用 enum 关键字后,就不能再继承其它类了,
    //  因为 enum 会隐式继承 Enum,而 Java 是单继承机制
    /*
    enum Season4 extend A{
    
    }
    */
    
    //2.enum类仍然是个类,所以还是可以实现接口的
    interface IPlaying{
        public void Playing();
    }
    
    
    enum Music implements IPlaying{
        CLASSICMUSIC;//==> public final Music CLASSICMUSIC = new Music();
    
        @Override
        public void Playing() {
            System.out.println("播放好听的音乐..");
        }
    }
    
posted @ 2022-02-21 18:45  DL50  阅读(51)  评论(0编辑  收藏  举报