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每个常量对象表示不同的货币,那么由于不同的货币对于人民币都有不同的换算方法,所以每个
常量对象实例化自己的换算方法,就达到了解决实际问题的总用
既简单有明了
而且需要注意的是,只要是声明一个枚举常量对象的话,就必须对所有的抽象方法进行实例化