public enum WeekDay // 内部类
{
SUN(2), MON(1), TUE, WED, THR, FRI, SAT;
private WeekDay()
{
System.out.println("first");
}
private WeekDay(int x)
{
System.out.println("second");
}
}
public static void main(String[] args)
{
WeekDay week2 = WeekDay.FRI;
System.out.println(week2.TUE);
System.out.println(week2);
System.out.println(week2.name());
System.out.println(week2.ordinal());
System.out.println("valueof :" + week2.valueOf("SUN"));
System.out.println("-------------------------");
System.out.println(week2.values().length);
String str = Arrays.toString(week2.values());
System.out.println(str);
}
public enum TrafficLamp
{
RED(30) // RED 理解 由TrafficLamp 的一个子类实现
{
public TrafficLamp nextLamp()
{
return GREEN;
}
},
GREEN(45)
{
public TrafficLamp nextLamp()
{
return YELLOW;
}
},
YELLOW(5)
{
public TrafficLamp nextLamp()
{
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time)
{
this.time = time;
}
}
}
上面程序打印结果:
second
second
first
first
first
first
first
TUE
FRI
FRI
5
valueof :SUN
-------------------------
7
[SUN, MON, TUE, WED, THR, FRI, SAT]
分析:
程序首先定义了一个WeekDay枚举,它里面定义了7个实例,有2个构造方法,一个带参数,一个不带参数,
SUN(2)表示SUN实例是调用private WeekDay(int x)带参数的方法构造的。
WeekDay week2 = WeekDay.FRI;
程序开始运行,加载WeekDay构造7个实例,SUN(2), MON(1)是调用带参数构造方法构造,所以打印2个second,
后面5个实例打印first.
接着打印week2.TUE为TUE,week2为FRI不难理解,week2.name()为此枚举的名字打印FRI,
week2.ordinal()打印此枚举实例在枚举初始化时的位置,枚举初始化第一个实例的值为0,所以
FRI的ordinal()为5。
valueOf方法返回以枚举名字为参数的枚举实例,参数为"SUN",所以打印SUN.
values()方法返回次枚举中实例的数组表示,长度为7,week2.values().length打印值为7.
最后打印values()返回的枚举数组的字符串表示形式[SUN, MON, TUE, WED, THR, FRI, SAT]。
上面程序还有一个内部类枚举TrafficLamp,内含有一个抽象方法public abstract TrafficLamp nextLamp();
作为枚举内部的实例RED,GREEN,YELLOW必需要实现类的抽象方法,所以在枚举的内部加上抽象方法,可以让枚举
的每个实例以不同的实现方式实现,枚举中还可以定义自己的属性和方法。
看下面用普通类型模拟枚举的实现:
public class WeekDays
{
private WeekDays()
{
}
public WeekDays nextDay()
{
if (this == SUN)
return MON;
else
return SUN;
}
public static final WeekDays SUN = new WeekDays();
public static final WeekDays MON = new WeekDays();
public String toString()
{
return this == SUN ? "sun" : "mon";
}
}
枚举要限定对象实例的数量,要外面不能new,所以构造方法写成private,
WeekDays类中定义了2个static final的实例,SUN,MON,就是表示模拟枚举类中只能引用2个实例,
类中还可以定义自己的方法nextDay(),重写了toString方法。
看下面也是同样可以在类中定义抽象的方法,让每个类的实例去单独的实现:
private WeekDays(){}
public static final WeekDays SUN = new WeekDays(){
@Override
public WeekDays nextDay()
{
return MON;
}};
public static final WeekDays MON = new WeekDays(){
@Override
public WeekDays nextDay()
{
return SUN;
}};
public abstract WeekDays nextDay();
用抽象类和抽象方法把上面nextDay()方法中大量的if-else语句转移成一个个独立的类的具体实现了。
还有,如果枚举中只有一个成员就可以作为一种单例的实现方式,相信大家都能理解。好了,有关java的
枚举就介绍到这里了,谢谢。