---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
一、枚举类的定义:
查阅:API中Enum类是一个抽象类,实现了Serizlizable和Comparable接口,继承Object类。枚举是使用enum关键字来修饰类名来创建枚举类,相当于它继承了Enum这个抽象类,可以使用其中的方法
二、枚举的特点:
1、枚举是一个特殊的类,其中可以定义构造方法,成员变量,普通方法,和抽象方法。
2,、枚举类中的构造方法必须是private私有的,因为枚举中的成员变量是固定不变,所以用静态常量来表示,用大写字母表示。外面对其访问可以通过(类名、常量)来调用。
3、枚举类是一个fian类,他的抽象方法必须在它的内部实现
4、枚举是一个特殊的类,他的每个元素就是他的一个实例对象,因此他不可以有子类
5、枚举元素必须位于枚举类中的第一行,用逗号分开,结尾用分号结束。否则会编译不通过
6、枚举元素可以使用switch选择语句
三、枚举的应用:
枚举就让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器就报错,枚举可以让编译器在编译时期就可控制程序中填写的非法值,普通变量的发送在开发阶段无法实现这一目标。这时就要用的枚举类
练习:
/*
* 用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。
1、私有的构造方法
2、每个元素分别用一个公有的静态成员变量表示
3、可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
*/
public abstract class WeekDay {
private WeekDay(){}
public final static WeekDay SUN=new WeekDay(){
public WeekDay nextDay(){
return MON;
}
};
public final static WeekDay MON=new WeekDay(){
public WeekDay nextDay(){
return SUN;
}
};
public abstract WeekDay nextDay();
public String toString(){
return this==SUN?"SUM":"MON";
}
}
练习:一周7天的例子。
public class WeekdayTest
{
public static void main(String[] args)
{
Weekday[] days = Weekday.values();
for(Weekday day : days)
{
System.out.println("今天是: "+day);
System.out.println("明天是:"+day.nextDay());
}
}
//定义一个内部枚举类
enum Weekday
{
//每个元素使用匿名内部类的方法来实现抽象方法,返回当天的下一天是星期几
MON
{
@Override
public Weekday nextDay()
{
return TUE;
}
} ,
TUE
{
@Override
public Weekday nextDay()
{
return WED;
}
},
WED
{
@Override
public Weekday nextDay()
{
return THU;
}
},
THU
{
@Override
public Weekday nextDay()
{
return FRI;
}
},
FRI
{
@Override
public Weekday nextDay()
{
return SAT;
}
},
SAT
{
@Override
public Weekday nextDay()
{
return SUN;
}
},
SUN
{
@Override
public Weekday nextDay()
{
return MON;
}
};
//定义一个抽象方法来表示下一天是星期几
public abstract Weekday nextDay();
}
}
练习:带参数的私有的构造方法。
public class EnumTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
WeekDay1 weekDay=WeekDay1.SUN;
System.out.println(weekDay);
WeekDay weekDay2=WeekDay.SAT;
System.out.println(weekDay2);
System.out.println("对象名字:"+weekDay2.name());
System.out.println("返回对象的天数:"+weekDay2.ordinal());
System.out.println("返回数组:"+weekDay2.values());
System.out.println("返回枚举类元素个数:"+weekDay2.values().length);
System.out.println("求字符串对应的WeekDay2的值:"+weekDay2.valueOf("FRI"));
}
//enum关键字,枚举,内部类
public enum WeekDay{
//带参数的构造方法
SUN,MON,TUE,WED,THI,FRI(1),SAT;
WeekDay(){
System.out.println("空参数");
}
WeekDay(int i){System.out.println("int参数:");}
}
练习:交通灯例子。
//enum关键字,枚举,内部类
public enum WeekDay{
//带参数的构造方法
SUN,MON,TUE,WED,THI,FRI(1),SAT;
WeekDay(){
System.out.println("空参数");
}
WeekDay(int i){System.out.println("int参数:");}
}
//交通灯,的枚举类
public enum TrafficLamp{
RED(10){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return GREEN;
}
},
GREEN(8){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return YELLOW;
}
},
YELLOW(3){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return RED;
}
};
//无参构造方法
public abstract TrafficLamp nextLamp();
int time;
//有参构造方法
private TrafficLamp(int time){
this.time=time;
}
}
}