JAVA回顾二之枚举类的使用

来源:互联网 发布:淘宝商家发货流程 编辑:程序博客网 时间:2024/09/21 06:37

 关于枚举类,最近看了一些实例 ,并且自己下手写了一些代码。最终感觉枚举类的实质就是下面几句话,不知道对不对:

   枚举值  S111、SBBB、SCCC都是AAA“类”的实例,或者可以是AAA“类”的派生类实例。 

       它们在实例化的时候都要调用AAA的构造器,如果调用实例的方法,直接S111.就能出来。

  枚举是一种类型,用于定义变量,以限制变量的赋值;赋值时通过“枚举名.值”取得枚举中的值

   System.out.println("枚举调用类的方法="+SeasonEnum.summer.choiceSeason());

原理分析

        enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum<E>。EnumTest 经过反编译(javap com.hmw.test.EnumTest 命令)之后得到的内容如下:

public class com.hmw.test.EnumTest extends java.lang.Enum{
    public static final com.hmw.test.EnumTest MON;
    public static final com.hmw.test.EnumTest TUE;
    public static final com.hmw.test.EnumTest WED;
    public static final com.hmw.test.EnumTest THU;
    public static final com.hmw.test.EnumTest FRI;
    public static final com.hmw.test.EnumTest SAT;
    public static final com.hmw.test.EnumTest SUN;
    static {};
    public int getValue();
    public boolean isRest();
    public static com.hmw.test.EnumTest[] values();
    public static com.hmw.test.EnumTest valueOf(java.lang.String);
    com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest);
}

所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。

总结

    可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。

package com.sd;/** * 枚举用法详解 * * @author ztf * */public class TestEnum2 {    /**     * 普通枚举     *     * @author ztf     *     */    public enum ColorEnum {        red, green, yellow, blue;    }    /**     * 枚举像普通的类一样可以     * 添加属性和方法,可以为它添加静态和非静态的属性或方法     *     * @author ztf     *     */    public enum SeasonEnum {        //注:枚举写在最前面,否则编译出错        spring, summer, autumn, winter;        //静态变量        private final static String position = "test";        //静态方法        public static SeasonEnum getSeason() {            if ("test".equals(position))                return spring;            else                return winter;        }        public SeasonEnum choiceSeason(){            if("test".equals(position)){                return winter;            }else{                return summer;            }        }    }    /**     * 性别     *     * 实现带有构造器的枚举     *     * @author jiqinlin     *     */    public enum Gender{        //通过括号赋值,而且必须带有一个参构造器和一个属性跟方法,否则编译出错        //赋值必须都赋值或都不赋值,不能一部分赋值一部分不赋值;如果不赋值则不能写构造器,赋值编译也出错        MAN("MAN"), WOMEN("WOMEN");        private final String value;        //构造器默认也只能是private, 从而保证构造函数只能在内部使用        Gender(String value) {            this.value = value;        }        public String getValue() {            return value;        }    }    /**     * 订单状态     *     * 实现带有抽象方法的枚举     *     * @author jiqinlin     *     */    public enum OrderState {        /** 已取消 */        CANCEL {public String getName(){return "已取消";}},        /** 待审核 */        WAITCONFIRM {public String getName(){return "待审核";}},        /** 等待付款 */        WAITPAYMENT {public String getName(){return "等待付款";}},        /** 正在配货 */        ADMEASUREPRODUCT {public String getName(){return "正在配货";}},        /** 等待发货 */        WAITDELIVER {public String getName(){return "等待发货";}},        /** 已发货 */        DELIVERED {public String getName(){return "已发货";}},        /** 已收货 */        RECEIVED {public String getName(){return "已收货";}};        public abstract String getName();    }    public static void main(String[] args) {        //枚举是一种类型,用于定义变量,以限制变量的赋值;赋值时通过“枚举名.值”取得枚举中的值        ColorEnum colorEnum = ColorEnum.blue;        switch (colorEnum) {            case red:                System.out.println("color is red");                break;            case green:                System.out.println("color is green");                break;            case yellow:                System.out.println("color is yellow");                break;            case blue:                System.out.println("color is blue");                break;        }        //遍历枚举        System.out.println("遍历ColorEnum枚举中的值");        for(ColorEnum color : ColorEnum.values()){            System.out.println(color);        }        //获取枚举的个数        System.out.println("ColorEnum枚举中的值有"+ColorEnum.values().length+"个");        //获取枚举的索引位置,默认从0开始        System.out.println(ColorEnum.red.ordinal());//0        System.out.println(ColorEnum.green.ordinal());//1        System.out.println(ColorEnum.yellow.ordinal());//2        System.out.println(ColorEnum.blue.ordinal());//3        //枚举默认实现了java.lang.Comparable接口        System.out.println(ColorEnum.red.compareTo(ColorEnum.green));//-1        //--------------------------        System.out.println("===========");        System.err.println("季节为" + SeasonEnum.getSeason());        //--------------        System.out.println("===========");        for(Gender gender : Gender.values()){            System.out.println(gender.value);        }        //--------------        System.out.println("===========");        for(OrderState order : OrderState.values()){            System.out.println(order.getName());        }        System.out.println("枚举调用类的方法="+SeasonEnum.summer.choiceSeason());    }}