枚举是J2SE5.0引入的新特性。从表面上看Java的枚举与其它语言中使用的枚举相似,只是一个命名整型常量的列表。而事实并非如此,Java中的枚举被定义为了一个类类型。将枚举引入类以后,枚举的功能被大大扩展,Java中的枚举可以有构造函数、方法和实例变量、甚至可以实现接口。每一个枚举常量都是它的枚举类型的一个对象 ,因此为枚举类定义构造函数,建立每个枚举常量时都要调用该构告函数。
=========================Writed by Jack.Hao on 2011.01.20========================
一、枚举基础
创建枚举类型需要使用新增关键词enum 。
enum Color{
White,Red,Blue,Black,Yellow;
}
其中的White,Red这一类标识符被称为枚举常量,它们被隐式声明为Color的公有、静态成员。枚举一定被定义,就可以创建该类型的变量,但却不能使用new关键字实例化一个枚举 。枚举变量的声明和使用方法同操作基本数据类型相似。
Color color = Color.Red ;
1)枚举常量的判等 :可以使用关系运算符“==”来判断两个枚举常是是否相等 if( color == Color.Red )
2)枚举常量可用于switch :
switch( color ) {
case Red :
case Blue :
......
}
注:case语句中,使用枚举常量时不需要使用枚举类型进行限定,而且那样也是无法通过编译的。因为,case常量的枚举定型被隐式的指定为switch表达式中的枚举类型,所以不需要在case中再一次进行指定。case Color.Red 是不合法的,无法通过编译。
enum Color{
White(10),Red(9),Blue(8),Black(7),Yellow(6),Green;
private int value ;
Color( int v ){
value = v ;
}
Color(){
value = -1 ;
}
int getValue(){
return value ;
}
}
class EnumTest{
public static void main( String [] args ){
for( Color c : Color.values ){
System.out.println( c.getPrice() ) ; // 10 9 8 7 6
}
}
}
3)显示一个枚举常量
System.out.println( Color.Red ) ; //Red
=========================Writed by Jack.Hao on 2011.01.20========================
二、values()与valueOf()方法
所有的枚举类型都包括两个方法:values()与valueOf(),形式如下:
public static enum-type [] values( )
public static enum-type valueOf( String str )
values():返回的是枚举常量的数组,valueOf():返回与字符串表示的常量名相关的枚举值
class TestEnum{
public static void main( String [] args ){
Color color ;
Color [] colors = Color.values() ;
for( Color c : colors ){
System.out.println( c ) ;
}
color = Color.valueOf( "Red" ) ;
System.out.println( color ) ;
}
}
枚举有两个限制:1)枚举不能继承自另一个类 2)枚举类不能有子类,枚举类是不可以被扩展的
=========================Writed by Jack.Hao on 2011.01.20========================
三、实现自己枚举类
尽管我们在声明枚举时不能继承自任何类,但是所有的枚举类都会继承自一个类:java.lang.Enum。此类是所有枚举类的父类,但在声明时不需要我们指定。
Enum定义了三个方法供所有的枚举类使用:
ordinal():得到枚举常量在常量列表中的位置值,值从0开始
compareTo():比较同一个枚举类型 的两个常量的顺序值大小
equals():比较两个枚举常量值是否相等,(相等:0 小于:负值 大于:正值),Enum类重写了Object()定义的equals()方法。尽管equals()可以比较一个枚举常量与其它任何对象,但是只有当这两个对象属于同一个枚举类型且指向同一个常量时,二者才会相等。如果这两个常量来自不同的枚举,仅仅具有相同的顺序equals()是不会返回true 的。
关系运行符==:两人上枚举常量必须完全相等才会返回true