一、枚举作用的介绍
所谓的“枚举”,其实就是让某个类型变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时期就控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
二、用普通类模拟枚举实现的原理
由于在实际的开发中,程序中经常免不了要用到时间问题,为了更好的统一表示“星期几”这个问题,我们可以自定义一个WeekDay类,具体代码如下:
public class EnumTest {
public static void main(String[] args) {
WeekDay weekDay2 = WeekDay.FRI;
System.out.println(weekDay2);
}
public enum WeekDay{
SUN(1),MON(),TUE,WED,THI,FRI,SAT;
private WeekDay(){System.out.println("first");}
private WeekDay(int day){System.out.println("second");}
}
}
三、枚举的基本应用
1、int compareTo(E o)
比较此枚举与指定对象的顺序。
2、boolean equals(Object other)
当指定对象等于此枚举常量时,返回 true。
3、Class<E> getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。
4、int hashCode()
返回枚举常量的哈希码。
5、String name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。
6、int ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
7、String toString()
返回枚举常量的名称,它包含在声明中。
8、static <T extends Enum<T>>
T valueOf(Class<T> enumType, String name)
返回带指定名称的指定枚举类型的枚举常量。
9、示例代码如下:
import java.util.Date;
public class EnumTest {
public static void main(String[] args) {
WeekDay weekDay2 = WeekDay.FRI;
System.out.println(weekDay2);
System.out.println(weekDay2.name());
System.out.println(weekDay2.ordinal());
System.out.println(WeekDay.valueOf("SUN").toString());
System.out.println(WeekDay.values().length);
}
public enum WeekDay{
SUN(1),MON(),TUE,WED,THI,FRI,SAT;
private WeekDay(){System.out.println("first");}
private WeekDay(int day){System.out.println("second");}
}
}
四、实现带有构造方法的枚举
事实上,由于枚举中的每一个成员都是一个对象,由于是对象就可以初始化,所以就要调用构造方法,常见的枚举类型都没有书写构造方法,但那并不代表就没有构造方法,它只是调用了默认的空的构造方法而已。下面我们就书写一下拥有构造方法的枚举:
具体代码如下:
import java.util.Date;
publicclass EnumTest {
publicstaticvoid main(String[] args) {
}
publicenum TrafficLamp{
RED(30),
GREEN(45),
YELLOW(5);
privateinttime;
private TrafficLamp(int time){this.time = time;}
}
}
五、实现带有抽象方法的枚举
既然枚举中的每一个成员都是一个对象,那么当我们定义了一个抽象方法时,它自然也要实现此抽象方法了,下面我们就做演示;
具体代码如下:
import java.util.Date;
publicclass EnumTest {
publicstaticvoid main(String[] args) {
}
publicenum TrafficLamp{
RED(30){
public TrafficLamp nextLamp(){
returnGREEN;
}
},
GREEN(45){
public TrafficLamp nextLamp(){
returnYELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
returnRED;
}
};
publicabstract TrafficLamp nextLamp();
privateinttime;
private TrafficLamp(int time){this.time = time;}
}
}