Administrator
发布于 2025-08-15 / 1 阅读
0
0

JavaSE-枚举类

  1. 枚举类的理解:

    枚举类型本质上也是一种类,只不过是这个类的对象是有限的、固定的几个,不能让用户随意创建

  2. 举例

    星期:Monday(星期一)...... Sunday(星期天)

    性别:Man(男)、Woman(女)

    月份:January(一月)...... December(十二月)

    季节:Spring(春季)...... Winter(冬季)

    三原色:red(红色)、green(绿色)、blue(蓝色)

    支付方式:Cash现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡)

    就职状态:Busy(忙碌)、Free(空闲)、Vocation(休假)、DIsmission(离职

    订单状态:Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配货)、Delivered(已发货)、Checked(已收货)

    线程状态:创建、就绪、、运行、阻塞、死亡

  3. 开发中的建议:

    开发中,如果针对于某个类,其实咧是确定个数的。则推荐将此类声明为枚举类。

    如果枚举类的实例只有一个,则可以看作是单例的实现方法

    jdk5.0之前

    public class SeasonTest {
        public static void main(String[] args) {
            System.out.println(Season.SPRING.getSeasonName() + " " + Season.SPRING.getSeasonDesc());
        }
    }
    ​
    //jdk5.0之前定义枚举类的方式
    class Season{
        //2.声明当前类的对象的实例变量,需要用private final来修饰
        private final String seasonName;
        private final String seasonDesc;
    ​
        //1.私有化类的构造器
        private Season(String seasonName,String seasonDesc) {
            this.seasonName = seasonName;
            this.seasonDesc = seasonDesc;
        }
    ​
        //3.提供实例变量的get方法
    ​
        public String getSeasonName() {
            return seasonName;
        }
    ​
        public String getSeasonDesc() {
            return seasonDesc;
        }
    ​
        //4.创建当前类的实例,需要用public static final来修饰
        public static final Season SPRING  = new Season("春天","春暖花开");
        public static final Season SUMMER = new Season("夏天","炎炎夏日");
        public static final Season AUTUMN = new Season("秋天","秋高气爽");
        public static final Season WINTER = new Season("冬天","凛冬将至");
    ​
        @Override
        public String toString() {
            return "Season{" +
                    "seasonName='" + seasonName + '\'' +
                    ", seasonDesc='" + seasonDesc + '\'' +
                    '}';
        }
    }

    jdk5.0中

    public class SeasonTest1 {
        public static void main(String[] args) {
            System.out.println(Season1.SPRING.getClass());
            System.out.println(Season1.SUMMER.getClass().getSuperclass());
        }
    }
    ​
    enum Season1{
        //1.必须在枚举类的开头声明多个对象。对象之间用“,”隔开
        SPRING("春天","春暖花开"),
        SUMMER("夏天","炎炎夏日"),
        AUTUMN("秋天","秋高气爽"),
        WINTER("冬天","凛冬将至");
    ​
        private final String seasonName;
        private final String seasonDesc;
    ​
        private Season1(String seasonName,String seasonDesc){
            this.seasonName = seasonName;
            this.seasonDesc = seasonDesc;
        }
    ​
        public String getSeasonName() {
            return seasonName;
        }
    ​
        public String getSeasonDesc() {
            return seasonDesc;
        }
    ​
        @Override
        public String toString() {
            return "Season1{" +
                    "seasonName='" + seasonName + '\'' +
                    ", seasonDesc='" + seasonDesc + '\'' +
                    '}';
        }
    }
    ​
  4. Enum中的常用方法:

    4.1 使用Enum关键字定义的枚举类,默认其父类是java.lang.Enum类

    使用Enum关键字定义的枚举类,不要再显式的定义以其父类。否则报错

    4.2 熟悉Enum类中常用的方法:

    • String toString():默认返回的是常量名(对象名),可以继续手动重写该方法

    • static 枚举类型[ ] values():返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值,是一个静态方法

    • static 枚举类型 valuesOf(String name):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如果不是,会有运行时异常:IllegalArgumentException

    • String name():得到当前枚举常量的名称。建议优先使用toStirng()

    • int ordinal():返回当前枚举常量的次序号,默认从0开始

  5. 枚举类实现接口的操作:

    情况1:枚举类实现接口,在枚举类中重写接口中的抽象方法。当通过不同的枚举类对象调用此方法时,执行的是同一个方法

    interface Info{
     void show();
    }
    ​
    enum Season1  implements Info{
     //1.必须在枚举类的开头声明多个对象。对象之间用“,”隔开
     SPRING("春天","春暖花开"),
     SUMMER("夏天","炎炎夏日"),
     AUTUMN("秋天","秋高气爽"),
     WINTER("冬天","凛冬将至");
    ​
     private final String seasonName;
     private final String seasonDesc;
    ​
     private Season1(String seasonName,String seasonDesc){
         this.seasonName = seasonName;
         this.seasonDesc = seasonDesc;
     }
    ​
     public String getSeasonName() {
         return seasonName;
     }
    ​
     public String getSeasonDesc() {
         return seasonDesc;
     }
    ​
     @Override
     public String toString() {
         return "Season1{" +
                 "seasonName='" + seasonName + '\'' +
                 ", seasonDesc='" + seasonDesc + '\'' +
                 '}';
     }
    ​
     @Override
     public void show() {
         System.out.println("这是一个季节");
     }
    }

    情况2:让枚举类的每一个对象重写接口中的抽象方法。当通过不同的枚举类对象调用此方法时,执行的是不同的实现方法

    public class SeasonTest2 {
     public static void main(String[] args) {
         Season2[] values = Season2.values();
         for(int i = 0; i < values.length; i++){
             values[i].show();
         }
     }
    }
    ​
    interface Info1{
     void show();
    }
    ​
    enum Season2 implements Info1{
     //1.必须在枚举类的开头声明多个对象。对象之间用“,”隔开
     SPRING("春天","春暖花开"){
         @Override
         public void show() {
             System.out.println("春天在哪里");
         }
     },
     SUMMER("夏天","炎炎夏日"){
         @Override
         public void show() {
             System.out.println("宁静的夏天");
         }
     },
     AUTUMN("秋天","秋高气爽"){
         @Override
         public void show() {
             System.out.println("秋意浓");
         }
     },
     WINTER("冬天","凛冬将至"){
         @Override
         public void show() {
             System.out.println("冬天里的一把火");
         }
     };
    ​
     private final String seasonName;
     private final String seasonDesc;
    ​
     private Season2(String seasonName,String seasonDesc){
         this.seasonName = seasonName;
         this.seasonDesc = seasonDesc;
     }
    ​
     public String getSeasonName() {
         return seasonName;
     }
    ​
     public String getSeasonDesc() {
         return seasonDesc;
     }
    ​
     @Override
     public String toString() {
         return "Season1{" +
                 "seasonName='" + seasonName + '\'' +
                 ", seasonDesc='" + seasonDesc + '\'' +
                 '}';
     }
    }


评论