• 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("播放好听的音乐..");
          }
      }
      
  • 相关阅读:
    mysql按月获取一年内每个月的数据量
    Intellij IDEA的激活
    mysql随机更新时间
    获取mysql数据表中的列名
    maven PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path
    sublime相关设置
    行走在这个城市,无助的是怀念悲伤
    如何开软件公司
    MYSQL常用语句
    爱——无题
  • 原文地址:https://www.cnblogs.com/DL50/p/15920134.html
Copyright © 2020-2023  润新知