java基础篇2之枚举
Posted 一心行走
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础篇2之枚举相关的知识,希望对你有一定的参考价值。
1、为什么要有枚举
问题:要定义星期几或者性别的变量,该怎么定义?
假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday=0;
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器就会报错,
枚举可以让编译器在编译时就可以控制源程序中填写的非法制,普通变量的方式在开发阶段无法实现这一目标
2、用普通类如何实现枚举功能,定义一个WeekDay的类来模拟枚举功能
- 私有的构造方法
- 每个元素分别用一个公有的静态成员变量表示
- 可以有弱冠公有方法或者抽象方法,例如,要提供nextDay方法必须使抽象的
采用抽象方法定义nextDay就将大量的if else语句庄毅成一个个独立的类。
public class WeekDay{ private WeekDay(){} public final static WeekDay SUN = new WeekDay(){ @Override public WeekDay nextDay(){ return MON; } }; public final static WeekDay MON = new WeekDay(){ @Override public WeekDay nextDay(){ return SUN; } }; public abstract WeekDay nextDay(); /*public WeekDay nextDay(){ if(this == SUN){ return MON; }else{ return SUN; } }*/ public String toString(){ return this ==SUN?"SUN":"MON"; } } public class EnumTest{ WeekDay weekday = WeekDay.SUN; System.out.println(weekday.toString()); System.out.println(weekday.nextDay()); }
3、枚举的基本应用
扩展:枚举类的values,valueOf,name,toString,ordinal方法
总结:枚举是一种特殊的类,其中每个元素都是该类的一个实例对象,例如 调用WeekDay.SUN.getClass().getName
public class EnumTest{ public static void main(String[] args){ WeekDay weekday2 = WeekDay.FRI; System.out.println(weekday2); WeekDay.valueOf("SUN").toString(); WeekDay.values().length; } public enum WeekDay{ SUN,MON,TUE,WED,THI,FRI,SAT } }
4、带有构造方法的枚举
public class EnumTest{ public static void main(String[] args){ WeekDay weekday2 = WeekDay.FRI; System.out.println(weekday2); WeekDay.valueOf("SUN").toString(); WeekDay.values().length; } public enum WeekDay{ SUN(1),MON,TUE,WED,THI,FRI,SAT; //放在参数列表之后 private WeekDay(){...}; private WeekDay(int day){...}; } }
5、带有抽象方法的枚举
//子类实现父类的抽象方法 public enum TrafficLamp(){ RED(30){ 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; } }
枚举只有一个成员时,就可以作为一个单例的实现方式
以上是关于java基础篇2之枚举的主要内容,如果未能解决你的问题,请参考以下文章