先看例子:
<pre name="code" class="java">package EnumTest;
enum enumTest // 枚举类型与class用法类似
{
Mon ( 1 , "Monday" ) , Tue ( 2 , "Tuesday" ) , Wed ( 3 , "Wednesday" ) , Thu (
4 , "Thursday" ) , Fri ( 5 , "Friday" ) , Sat ( 6 , "Saturday" ) , Sun (
7 , "Sunday" );
private int intDay;
private String strDay;
public void setStrDay ( String strDay )
{
this.strDay = strDay;
}
public String getStrDay ( )
{
return strDay;
}
public void setIntDay ( int intDay )
{
this.intDay = intDay;
}
public int getIntDay ( )
{
return intDay;
}
private enumTest ( int i , String day ) // 必须有一个只含参的构造方法
{
this.setStrDay( day );
this.setIntDay( i );
}
public static void printDay ()
{
for ( enumTest i : enumTest.values( ) )
{
switch ( i.getIntDay( ) )
{
case 1 :
System.out.println( enumTest.Mon );
break;
case 2 :
System.out.println( enumTest.Tue );
break;
case 3 :
System.out.println( enumTest.Wed );
break;
case 4 :
System.out.println( enumTest.Thu );
break;
case 5 :
System.out.println( enumTest.Fri );
break;
case 6 :
System.out.println( enumTest.Sat );
break;
case 7 :
System.out.println( enumTest.Sun );
break;
default :
System.out.println( "wrong number!" );
}
}
enumTest et = enumTest.Fri;
System.out.println( "本枚举所在循序为:" + et.ordinal( ) );
}
public static void main ( String[ ] args )
{
printDay( );
}
}
运行结果为:
Mon
Tue
Wed
Thu
Fri
Sat
Sun<pre name="code" class="plain">本枚举所在循序为:4
实际上,enum声明的就是一个类,jvm将enum类型的声明也编译为enumTest.class。
而这些类都是类库中Enum类的子类(java.lang.Enum<E>)。它们继承了这个Enum中的许多有用的方法。
枚举类的类型为public final,定义的枚举变量的类型为public static final
枚举类的声明必须定义构造方法,使用private修饰。这样可以保证外部代码无法新构造枚举类的实例。一般一个枚举中有几个参数,就定义几个需要封装的变量。枚举类的方法和数据域可以允许外部访问。
枚举可以继承的方法:
- ordinal()方法: 返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。
- compareTo()方法: Enum实现了java.lang.Comparable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出ClassCastException()异常。(具体可见源代码)
- values()方法: 静态方法,返回一个包含全部枚举值的数组。
- toString()方法: 返回枚举常量的名称。
- valueOf()方法: 这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。
- equals()方法: 比较两个枚举类对象的引用。