黑马程序员-JAVA基础之枚举

来源:互联网 发布:js 界面跳转 编辑:程序博客网 时间:2024/05/17 00:50

——- android培训、java培训、期待与您交流! ———-
什么是枚举?
现实中有这么一类是事物,它们只能取有限固定的值,比如星期几、性别、交通灯等等。java就针对这类事物定义了一个新的特性——枚举,它是一种特殊的类。
比如要定义星期几或性别的变量,该怎么定义?假设用1—7分别表示星期一到星期日,但有人可能会写成:int weekday=0;
枚举就是要让某个类型的变量的取值只能为若干个固定值的一个,否则编译器就会报错。枚举可以让编译器在编译时,就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标 。

枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法 。
枚举的特点:

1.私有构造方法。
2.每个元素分别用一个共有的静态成员变量表示。
3.可以有若干个公有方法和抽象方法。

枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后面有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误

带构造方法的枚举
* 1、构造方法必须定义成私有的
* 2、如果有多个构造方法,该如何选择哪个构造方法?
* 3、枚举元素MON和MON()的效果一样,都是调用默认的构造方法
带方法的枚举
* 1、定义枚举的TrafficLamp
* 2、实现普通的Lamp方法
* 3、实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义
* 4、增加上表示时间的构造方法

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

public class EnumTest  {      public static void main(String[] args)      {          WeekDay weekDay2=WeekDay.FRI;          System.out.println(weekDay2);          System.out.println(weekDay2.name());          System.out.println(weekDay2.ordinal());          System.out.println(WeekDay.valueOf("SUN"));          System.out.println(WeekDay.values().length);          new Date(300){};      }      public enum WeekDay      {          //元素列表必须位于所有成分之前,元素列表后有其他方法,那么元素列表最后必须带分号          SUN(1),MON,TUE,WED,THI,FRI,SAT;          //构造方法必须写成私有的          private WeekDay(){System.out.println("first");}          private WeekDay(int day){System.out.println("second");}      }  }

枚举中定义的交通灯有RED,GREEN,YELLOW三个值,意味着enum中事先定义了3个交通灯对象,而且只有这3个交通灯对象,因为构造方法是私有的。由于这3个对象可以由枚举名直接获取,所以这3个对象是静态的。

public enum TrafficLamp{      RED,GREEN,YELLOW;  }  TrafficLamp tl = TrafficLamp.GREEN;  System.out.println(tl);

枚举中可以定义抽象方法,这个抽象方法由其子类实现,枚举在建立3个对象时用内部类的形式继承带有抽象方法的枚举,实现抽象方法。

public enum TrafficLamp{      RED(20),GREEN(30),YELLOW(3);      private TrafficLamp(){}      private TrafficLamp(int time){          System.out.println(time);      }  }  <span style="white-space:pre">    </span>public enum TrafficLamp{          RED(20) {              @Override              public TrafficLamp nextLamp() {                  // TODO Auto-generated method stub                  return GREEN;              }          },          GREEN(30) {              @Override              public TrafficLamp nextLamp() {                  // TODO Auto-generated method stub                  return YELLOW;              }          },          YELLOW(3) {              @Override              public TrafficLamp nextLamp() {                  // TODO Auto-generated method stub                  return RED;              }          };          private TrafficLamp(){}          private TrafficLamp(int time){              System.out.println(time);          }          public abstract TrafficLamp nextLamp();       }  

——- android培训、java培训、期待与您交流! ———-

0 0