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;
}
}

枚举只有一个成员时,就可以作为一个单例的实现方式

最新文章

  1. HSSFWorkBooK用法
  2. ApacheServer-----关于443端口被占用的解决方法
  3. Visual Studio 启动修复命令
  4. BootStrap图标
  5. WBS说明
  6. redis 验证消息队列也是写磁盘的
  7. symfony2-创建提交表单生成数据过程
  8. 定位--position属性
  9. 一些JQuery使用技巧
  10. loadrunner下载资源时步骤下载超时 (120 seconds) 已过期
  11. shell编程练习-打印九九乘法表(附:awk编程)
  12. 第二部分之RDB持久化(第十章)
  13. Kubernetes之POD
  14. halcon应用案例探究
  15. SNF快速开发平台MVC-EasyUI3.9之-WebApi身份验证问题解决方案
  16. android检测手机是否安装某个app
  17. 【LeetCode刷题】SQL-Second Highest Salary 及扩展以及Oracle中的用法
  18. liunx trac 插件使用之DateFieldPlugin
  19. JVM内部细节之三:字符串及字符串常量池
  20. ubuntu/centos网络配置

热门文章

  1. CSU-1980 不堪重负的树
  2. importlib模块和split的结合使用
  3. 理解机器为什么可以学习(四)---VC Dimension
  4. 链表的问题,ListNode问题
  5. Java精确测量代码运行时间 代码执行时间 纳秒 nanoTime
  6. webform登陆界面样式丢失
  7. [Cocos2dx Bug] [win32] Function CCFileUtils::fullPathFromRelativeFile forget consider the path separated by '\\'
  8. 【bzoj4386】[POI2015]Wycieczki 矩阵乘法
  9. linux下头文件
  10. inux监控平台搭建-监控项