枚举

    技术2024-11-22  25

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

    最新回复(0)