当一个类的实例个数有限,并且固定,这时就可以用枚举。它和在接口里定义的常量差不多。
比如
interface week{
public static final int MON=1;
public static final int TUE=2;
...........
}
和
enum Week{
MON,TUE,...SUN;
}
区别在于,接口中的是常量,用整数来区别一周内的七天。而枚举用的是对象,并且提供相应的方法。
1.枚举它继承java.lang.enum类,而不是上帝object,并且该类实现了Serializable接口和comparable接口,所以肯定有compareTo(E)方法。
2.非抽象的枚举类默认使用final修饰,不能派生子类。如果枚举类内部有抽象方法,该类默认用abstract修饰,抽象方法用匿名子类对象实现(可不可以派生子类不清楚,如果你验证了,请告诉我)。
3.构造函数用并且只能用private修饰
4.因为枚举类的实例都是既定的,所以这些实例对象被规定只能显式全部的罗列在{}的第一行,这些实例被默认的public static final修饰。这些对象在罗列时,就相当于调用了对应的构造函数(这里的week就调用了7次),比如 第一个实例MON相当于public static final Week MON=new Week()。
如果定义了带参数的构造函数,罗列时也要相应的标明参数-------MON(“Monday”),TUE(“Tuesday”),...SUN(“Sunday”);--------
这里的MON(“Monday”)就相当于public static final Week MON=new Week(“Monday”);
使用他们时,用 类名.实例名 的方式获取他们。
5.附带的方法有 String name()返回实例的名字
String toString()和name()差不多;int ordinal()返回索引值,0开头;static values()返回该枚举的所有实例
static valueOf(Week.class,"SUN")返回字符串SUN对应的实例名
6.如果枚举类实现了接口,比如 interface MSG{void showInfo();}在枚举类里实现showInfo()时,他的每一个实例都会对应相同的方法体,因此
用匿名子类来具体化
enum Week implements MSG
{
MON{
public void showInfo(){System.out.println("今天是周一,要上班了"); }
},
TUE{
public void showInfo(){System.out.println("周二了,还有四天才放假"); }
},
...,
SUN{
public void showInfo(){ System.out.println("今天是周末,明天又要上班了"); }
};
}
|