枚举·为什么要有枚举 -问题:定义星期几或性别的变量,该这么定义?假设用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方法:每个元素分别是由枚举类的子类来生产的实例对象,这些子类采用类似内部类的方式进行定义。 -增加上表示时间的构造方法红灯过后就是绿灯,绿灯过后是黄灯,黄灯过后是红灯·枚举只有一个成员时,就可以作为一种单例的实现方式。