枚举
·为什么要有枚举
-问题:定义星期几或性别的变量,该这么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday =0;
-枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时
就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
·用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。
-私有的构造方法
-每个元素分别用一个公有的静态成员变量表示
-可以有若干公有方法或抽象方法,例如,要提供nextDay方法必须是抽象的。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
package lqq.heima;
public class EnumTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
WeekDay sun= WeekDay.SUN;
System.out.println(sun);
System.out.println(sun.nextDay());
}
}
package lqq.heima;
public abstract class WeekDay {
/*
英文,简写,中文
Monday,Mon,星期一
Tuesday,Tue,星期二
Wednesday,Wed,星期三
Thursday,Thu,星期四
Friday,Fri,星期五
Saturday,Sat,星期六
Sunday,Sun,星期日
*/
private WeekDay(){}
public final static WeekDay SUN = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return MON;
}
};
public final static WeekDay MON = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return TUE;
}
};
public final static WeekDay TUE = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return WED;
}
};
public final static WeekDay WED = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return THU;
}
};
public final static WeekDay THU = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return FRI;
}
};
public final static WeekDay FRI = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return SAT;
}
};
public final static WeekDay SAT = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return SUN;
}
};
public abstract WeekDay nextDay();
/*{
WeekDay nextWeek = null;
if(this == SUN)
{
nextWeek = MON;
}else if(this == MON)
{
nextWeek = TUE;
}else if(this == TUE)
{
nextWeek = WED;
}else if(this == WED)
{
nextWeek = THU;
}else if(this == THU)
{
nextWeek = FRI;
}else if(this == FRI)
{
nextWeek = SAT;
}else if(this == SAT)
{
nextWeek = SUN;
}
return nextWeek;
}*/
public String toString(){
String week = "Monday";
if(this == SUN)
{
week = "Sunday";
}else if(this == MON)
{
week = "Monday";
}else if(this == TUE)
{
week = "Tuesday";
}else if(this == WED)
{
week = "Wednesday";
}else if(this == THU)
{
week = "Thursday";
}else if(this == FRI)
{
week = "Friday";
}else if(this == SAT)
{
week = "Saturday";
}
return week;
}
}
·枚举的基本应用
-举例:定义一个Weekday的枚举。
-扩展:枚举类的values,valueOf,name,toString,ordinal等方法。
-总结:枚举 是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。
SAT后面可以写";"号也可以不写,都是一样的。当参数列表后面有内容的时候就必须要写";"号
public enum WeekDay{
SUN,MON,TUE,WED,THU,FRI,SAT
}
/*
英文,简写,中文
Monday,Mon,星期一
Tuesday,Tue,星期二
Wednesday,Wed,星期三
Thursday,Thu,星期四
Friday,Fri,星期五
Saturday,Sat,星期六
Sunday,Sun,星期日
*/
java5的枚举
·枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
·枚举元素必须位于枚举体重的最开始的部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法和变量等放在枚举元素的前面,编译器报告错误。
·带构造方法的枚举
-构造方法必须定义成私有的
-如果有多个构造方法,该如何选择哪个构造方法?
-枚举元素MON和MON()的效果一样,都是调用默认构造方法。
实现带有构造方法的枚举
·元素列表必须位于枚举中所有内容的之前,也就是元素列表必须在最前面
·构造方法必须是私有的private
·在枚举元素的后面加上()指定构造时候要调用的构造方法
·带方法的枚举
-定义枚举TrafficLamp
-实现普通的next方法
-实现抽象的next方法:每个元素分别是由枚举类的子类来生产的实例对象,这些子类采用类似内部类的方式进行定义。
-增加上表示时间的构造方法
红灯过后就是绿灯,绿灯过后是黄灯,黄灯过后是红灯
·枚举只有一个成员时,就可以作为一种单例的实现方式。