Java中的枚举类详讲

来源:互联网 发布:iphone 软件开关效果 编辑:程序博客网 时间:2024/06/16 03:02

枚举类型是JDK5.0的新特征。Sun引进了一个全新的关键字enum来定义一个枚举类。下面就总结一下自己对枚举类的一点看法:

1.枚举类可以实现一个或多个接口enum继承了java.lang.Enum

2.构造器要用private修饰,缺省方式就是private修饰的。

3.这个类的所有可能的实例都要使用public static final属性来保存

从某种程度上看enum和class和interface的用法大致相似!!

public enum SeasonEnum{    SPRING,SUMMER,FAIL,WINTER;    ......}

就如(枚举类的实例是已经定义的枚举类型,不能随便通过new来创建另外的枚举对象。

就如下面,他们前面都是省略了public static final,而且必须放在第一行

SPRING,SUMMER,FAIL,WINTER

 enum SeasonEnum{    SPRING,SUMMER,FAIL,WINTER;}public class TestEnum {    public void judge(SeasonEnum s){        switch(s)        {            case SPRING:                System.out.println("11111");                break;            case SUMMER:                 System.out.println("22222");                break;            case FAIL:                 System.out.println("33333");                break;            case WINTER:                 System.out.println("44444");                break;        }    }    public static void main(String[] args) {          for(SeasonEnum s:SeasonEnum.values())          {              System.out.println(s);          }          new TestEnum().judge(SeasonEnum.SPRING);    }}

这就是枚举类的一个简单的例子。values方法就是返回枚举类SeasonEnum的实例并通过迭代循环输出实例

public enum Gender{    //此处的枚举值必须调用对应的构造器来创建    MALE("男"),FEMALE("女");    private final name;    private Gender(String name)    {        this.name=name;    }    public String getNmae()    {        return this.name;    }}
在枚举类中列出枚举值时,实际上就是调用构造器创建枚举类对象,只是这里无需使用new关键字,也无需显示调用构造器。前面列出的枚举值时无需传入参数,甚至无需使用括号,仅仅前面的枚举类包含无参数的构造器。



实现接口的枚举类:

枚举类可以实现一个或多个接口。与普通类实现一个或多个接口是一样的,既要实现该接口所包含的方法,例如:

public interface GenderDesc{        void   info();}


下面的Gender枚举类就要实现info()该方法:

public enum Gender implements GenderDesc{     //枚举类中的其他的方法....     public void info()     {         //具体的代码.....     }}
你可能会发现枚举类实现接口也不过如此,与普通类实现接口完全一样,使用implements实现接口里包含的抽象方法.

但是枚举值实现该方法时,代码如下:

public enum Gender implements GenderDesc{    //此处的枚举值必须调用对应的构造器来创建    MALE("男")    //在花括号部分实际上是一个类体部分    {        public void info()        {            System.out.println("这个枚举值代表男性");        }    }     FEMALE("女")    {        public void info()        {            System.out.println("这个枚举值代表女性");        }    }}
从代码上可以看见花括号实际上就是一个类体部分,在这种情况下,当创建MALE,FEMALE枚举值时,并不直接创建了Gender枚举类的实例,而是相当于创建Gender的匿名子类的实例。  其实就和匿名内部类语法大致相似,只是它依然是枚举类的匿名内部类子类





包含抽象方法的的枚举类:

假设有一个Operation枚举类,它的四个枚举值PULS,MINUS,TIMES,DIVIDE分别代表加减乘除

public enum Operation{    PULS,MINUS,TIMES,DIVIDE;    //为枚举类定义一个方法,用于实现不同的运算    double eval(double x,double y)    {        switch(this)        {            case PULS: return x+y;                break;            case MINUS: return x-y;                break;            case TIMES: return x*y;                break;            case DIVIDE: return x/y;            default: return 0;                break;        }    }}
另外一种方式:
public enum Operation{    PULS    {        public double eval(double x,double y)        {            return x+y;        }    },//注意这个逗号    MINUS    {         public double eval(double x,double y)        {            return x-y;        }    },    TIMES    {         public double eval(double x,double y)        {            return x*y;        }    },     DIVIDE    {         public double eval(double x,double y)        {            return x/y;        }    };//注意这个分号     //为枚举类定义一个抽象方法,这个抽象方法不同的枚举值提供不同的实现     public static void main(String [] args)     {         System.out.println(Operation.DIVIDE.eval(2,1));
        //....     }}
编译这个程序会生成5个class文件,4个匿名内部子类和一个Operation类.

而且枚举类里面定义抽象方法无需显示使用abstract关键字


补充:点击打开链接


                                             
0 0