zoukankan      html  css  js  c++  java
  • 《五》枚举

    《五》枚举

    【一】枚举

    枚举是一个被命名的整型常量的聚合,用于声明一组带标识符的常量。

    1.使用枚举类型设置常量

    以往设置常量,通常将常量放置在接口中,这样在程序中就可以直接使用,并且该常量不能被修改,因为在接口中定义常量时,该常量的修饰符为final与static。

    新增枚举类型后就逐渐取代了这种常量的定义方式,因为通过使用枚举类型,可以赋予程序在编译时进行检查的功能。使用枚举类型定义常量的语法如下:

    public enum Const{
        const_A,
        const_B,
        const_C
    }

    1.1 比较常量和枚举的不同之处:

    interface Const { // 将常量放置在接口中
          public static final int Const_A = 1;
          public static final int Const_B = 2;
    }
    
    public class ConstTest {
          enum Const2 { // 将常量放置在枚举类型中
               Const_A, Const_B
          }
    
          // 使用接口定义常量
          public static void doit(int c) { // 定义一个方法,这里的参数为int型
               switch (c) { // 根据常量的值做不同操作
               case Const.Const_A:
                     System.out.println("doit() Const_A");
                     break;
               case Const.Const_B:
                     System.out.println("doit() Const_B");
                     break;
               }
          }
    
          public static void doit2(Const2 c) { // 定义一个参数对象是枚举类型的方法
               switch (c) { // 根据枚举类型对象做不同操作
               case Const_A:
                     System.out.println("doit2() Const_A");
                     break;
               case Const_B:
                     System.out.println("doit2() Const_B");
                     break;
               }
          }
    
          public static void main(String[] args) {
               ConstTest.doit(Const.Const_A); // 使用接口中定义的常量,结果为:doit() Const_A
               ConstTest.doit2(Const2.Const_A); // 使用枚举类型中的常量,结果为:doit2() Const_A
               ConstTest.doit2(Const2.Const_B); // 使用枚举类型中的常量,结果为:doit2() Const_B
               ConstTest.doit(3);//使用int类型,结果为:doit() Const_A
               ConstTest.doit2(3);//报错
          }
    }

    在上述代码中,当用户调用doit()方法时,使编译器不接受在接口中定义的常量参数,也不会报错;但调用doit2()方法,任意传递参数,编译器就会报错,因为这个方法只接受枚举类型的常量作为其参数。

    枚举类型可以在类的内部进行定义,也可以在类的外部定义,如果在类的内部定义,则类似于内部类形式。

    2.深入了解枚举类型 

    2.1操作枚举类型成员的方法

    Java 中的每一个枚举都继承自 java.lang.Enum 类。当定义一个枚举类型时,每一个枚举类型成员都可以看作是 Enum 类的实例,这些枚举成员默认都被 final、public, static 修饰,当使用枚举类型成员时,直接使用枚举名称调用成员即可。

    注意:

    • 枚举类不能继承其他类,因为在编译时它已经继承了 java.lang.Enum 类,java无法多继承
    • 使用enum定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类
    • 枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰
    • 枚举表示的类型其取值是必须有限的

    所有枚举实例都可以调用 Enum 类的方法,常用方法:

    方法名称 具体含义 使用方法
    values() 该方法可以将枚举成员以数组的形式返回 枚举类型名称.values()
    valuesOf() 该方法可以实现将普通字符串转化为枚举实例 枚举类型名称.values("abc")
    compareTo() 该方法用于比较两个枚举对象在定义时的顺序 枚举对象.compareTo()
    ordinal() 该方法用于得到枚举成员的位置索引 枚举对象.ordinal()

    经典实例:

    public enum Day {
        MONDAY("星期一", 1), TUESDAY("星期二", 2), WEDNESDAY("星期三", 3),
        THURSDAY("星期四", 4), FRIDAY("星期五", 5),
        SATURDAY("星期六", 6), SUNDAY("星期天", 7);//这个分号不可省略哦
    
        //先自定义两个自定义枚举的属性
        //此枚举类中包含的枚举对象的文字描述
        private String desc;
        //此枚举类中包含的枚举对象的对应的代码
        private int code;
    
        public String getDesc() {
            return desc;
        }
    
        public int getCode() {
            return code;
        }
    
        //通过自定义的code属性,来获取整个枚举对象,静态方法
        public static Day getDayByCode(int code) {
            Day day = null;
            switch (code) {
                case 1:
                    day = Day.MONDAY;
                    break;
                case 2:
                    day = Day.TUESDAY;
                    break;
                case 3:
                    day = Day.WEDNESDAY;
                    break;
                case 4:
                    day = Day.THURSDAY;
                    break;
                case 5:
                    day = Day.FRIDAY;
                    break;
                case 6:
                    day = Day.SATURDAY;
                    break;
                case 7:
                    day = Day.SUNDAY;
                    break;
            }
            return day;
        }
    
        //此枚举类自定义一个构造器
        private Day(String desc, int code) {
            this.desc = desc;
            this.code = code;
        }
    }
    public class DayDemo {
        public static void main(String[] args) {
            Day[] days = Day.values();
    
            //遍历枚举
    //        for(Day day:days){
    //            System.out.println(day.toString());
    //        }
    
    
            Day monday = Day.valueOf("MONDAY");//将普通字符串转化为枚举实例,返回的是monday对象
            Day sunday = Day.SUNDAY;//通过枚举类名直接使用
    
            //枚举的父类定义了一个odinal(),作用是取出枚举对象的索引值
            System.out.println(monday.ordinal());//0
            System.out.println(sunday.ordinal());//6
    
            //还有一个compareTo()方法,该方法用于比较两个枚举对象在定义时的顺序
            System.out.println(monday.compareTo(monday));//顺序一样时等于0
            System.out.println(monday.compareTo(sunday));//返回sunday索引-monday索引:-6
    
            //这3种方法结果一样,输出枚举的文字描述
            System.out.println(monday.name());
            System.out.println(monday.toString());
            System.out.println(monday);
        }
    }
  • 相关阅读:
    Python Tkinter canvas oval原理
    ButterKnife你需要知道的点
    RecyclerView不同类型Item的展示
    PNG图片小结
    安装应用
    java.io.IOException: open failed: ENOENT (No such file or directory)open failed: EISDIR (Is a directory)
    YouTube视频插入Markdown
    Android icons集合
    vue动态绑定类样式ClassName知多少
    js正则表达式中的正向肯定预查和正向否定预查
  • 原文地址:https://www.cnblogs.com/beimingdaoren/p/13043676.html
Copyright © 2011-2022 走看看