Java中的枚举规则

Java中的枚举相比于其他语言的枚举是非常强大的,这是由于Java中的枚举实际具有类的特点,因此我们

接下来从类的方面对java枚举进行详细的讲解,所以下面我们都将枚举称为“枚举类”,对象成为

“枚举对象”

首先,最简单的枚举实例就是

   enum E_SEASON

   {  SPRING , SUMMER,AUTUM,WINTER  }

1、所有的枚举型的“类”,都继承了java.lang.Enum类

2、在枚举类的内部的各个常量,实际上都是E_SEASON数据类型的常量对象,就和字符串常量"qwe"

   一样,本身是一个对象,在内存当中仅仅保存一份内容

   如:E_SEASON s = E_SEASON.SPRING;

       实际的意思就是说将枚举型的引用变量 s 指向常量对象E_SEASON.SPRING

       需要特别注意的是,虽然SPRING这些常量本身就是枚举型的常量对象,但是

       java规定不能直接使用SPRING,而是前面必须加上E_SEASON.以便更好地指明

       这是一个枚举型的对象

 

 

3、由于任何类型的枚举类都继承了父类,那么就自然的将父类中的方法继承过来了,

   还有一些成员方法现在还不知道是哪里继承来的,也一并介绍一下

   ① public String toString()

      这是父类中的方法,返回当前枚举对象内容的String表示

      如对象E_SEASON.SPRING.toString();就返回"SPRING",当然下面会提到可以重写该方法

   ② public String name()

      同样是返回当前对象的字符串表示,如:

      E_SEASON s = E_SEASON.SUMMER;

      s.name();   就返回"SUMMER"

   ③ static A values()

      A 指的是当前的枚举类型的数组对象类型,返回的是枚举类内部的枚举对象形成的数组,如:

      E_SEASON [] sa = E_SEASON.values();

      由于是静态的方法所以用类名调用,则sa[0]=E_SEASON.SPRING sa[1] = E_SEASON.SUMMER ;..

   ④ public int ordinal()

      返回当前对象在在枚举类的声明顺序

      我们知道在C++当中的枚举中,每个枚举变量都会自动从0开始,被赋值

      在java中也是这样的,每个枚举对象都会从0开始被赋值,只是如果我们用

      System.out.println(E_SEASON.SPRING);输出的是"SPRING",不是0

      这是因为程序自动调用了toString()方法,所以如果想要知道对象的序号,那么就可以

      调用ordinal()

   ⑤ static E valueOf(String str)

      E 指的是当前的枚举数据类型

      该方法就是根据str创建一个枚举对象,如:

      E_SEASON s = E_SEASON.valueOf ("SPRING");

   ⑥ int compareTo(E s)

      用于比较两个枚举对象的序列号的大小

      E_SEASON.SPRING.compareTo(E_SEASON.WINTER); 则结果小于零,为-3

4、由于枚举类型本省就是一个类,那么任何一个枚举类都可以声明自己的成员域和成员方法

   下面通过几个例子就会将之掌握:

①   enum DaysOfTheWeek{

         MONDAY("Work"),TUESDAY("Work"),WEDSDY("Free"),

         THUSDAY("Play"),FRIDAY("Study");

          //这几个常对象,实际就是成员域,最后用分号

          private String event; // 用event来存贮事件

          private DaysOfTheWeek(String str){event = str;}

         //构造方法,而且只能是private的

          String getEvent(){return event;} //获得event

          @Override

          public String toString(){......}

         //可以重写该方法,就不在具体写了

        }

       public class Apple

       {

          public static void main(String [] args)

          {

              DaysOfTheWeek dw = DaysOfTheWeek.WONDAY;

              System.out.println(dw.getEvent()); //输出"Work"

           }

       }

 

     这里需要注意的是,MONDAY("Work")中实际就调用了构造方法,而且只能是枚举常量对象

     通过这种方式调用构造方法,再无其他地方能调用构造方法了,也就是说形如new 方式是不存在的

②下面的这个用法和匿名类很像,这样的用法的一个非常好的地方是,每个不同的枚举常量对象都可以实例化自己的方法,这样

就有非常好的实际用途,比如下面的这个实际情况就是,KG、

CARAT、GMS、OUNCE、STONE每个常量对象表示不同的货币,那么由于不同的货币对于人民币都有不同的换算方法,所以每个

常量对象实例化自己的换算方法,就达到了解决实际问题的总用

既简单有明了

  

而且需要注意的是,只要是声明一个枚举常量对象的话,就必须对所有的抽象方法进行实例化

 

posted @ 2014-08-11 10:21  RoperLee  阅读(2091)  评论(0)    收藏  举报