黑马程序员-java-枚举

来源:互联网 发布:ubuntu恢复删除的文件 编辑:程序博客网 时间:2024/05/02 01:53
---------------------- android培训、java培训、期待与您交流! ----------------------
    枚举是java5.0的新特性,首先枚举是一个类,它的每个成员是它的一个实例对象。所以,在比较两个枚举类型的值时,永远不需要调用
equals,而直接使用"=="看可以了。
看实例分析:
package com.enumtest;
import java.util.Arrays;
public class EnumTest
{

 public enum WeekDay // 内部类
 {

  SUN(2), MON(1), TUE, WED, THR, FRI, SAT;
  private WeekDay()
  {
   System.out.println("first");
  }

  private WeekDay(int x)
  {
   System.out.println("second");
  }

 }
    public static void main(String[] args)
 {

  WeekDay week2 = WeekDay.FRI;
  System.out.println(week2.TUE);
  System.out.println(week2);
  System.out.println(week2.name());
  System.out.println(week2.ordinal());
  System.out.println("valueof :" + week2.valueOf("SUN"));
  System.out.println("-------------------------");
  System.out.println(week2.values().length);
  String str = Arrays.toString(week2.values());
  System.out.println(str);

 }
   public enum TrafficLamp
 {
  RED(30) // RED 理解 由TrafficLamp 的一个子类实现
  {
   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;
  }
   }
  }
上面程序打印结果:
second
second
first
first
first
first
first
TUE
FRI
FRI
5
valueof :SUN
-------------------------
7
[SUN, MON, TUE, WED, THR, FRI, SAT]
分析:
程序首先定义了一个WeekDay枚举,它里面定义了7个实例,有2个构造方法,一个带参数,一个不带参数,
SUN(2)表示SUN实例是调用private WeekDay(int x)带参数的方法构造的。
WeekDay week2 = WeekDay.FRI;
程序开始运行,加载WeekDay构造7个实例,SUN(2), MON(1)是调用带参数构造方法构造,所以打印2个second,
后面5个实例打印first.
接着打印week2.TUE为TUE,week2为FRI不难理解,week2.name()为此枚举的名字打印FRI,
week2.ordinal()打印此枚举实例在枚举初始化时的位置,枚举初始化第一个实例的值为0,所以
FRI的ordinal()为5。
valueOf方法返回以枚举名字为参数的枚举实例,参数为"SUN",所以打印SUN.
values()方法返回次枚举中实例的数组表示,长度为7,week2.values().length打印值为7.
最后打印values()返回的枚举数组的字符串表示形式[SUN, MON, TUE, WED, THR, FRI, SAT]。


上面程序还有一个内部类枚举TrafficLamp,内含有一个抽象方法public abstract TrafficLamp nextLamp();
作为枚举内部的实例RED,GREEN,YELLOW必需要实现类的抽象方法,所以在枚举的内部加上抽象方法,可以让枚举
的每个实例以不同的实现方式实现,枚举中还可以定义自己的属性和方法。

看下面用普通类型模拟枚举的实现:
public class WeekDays
{
 private WeekDays()
 {
 }
  public WeekDays nextDay()
 {
  if (this == SUN)
   return MON;
  else
   return SUN;
 }
  public static final WeekDays SUN = new WeekDays();
  public static final WeekDays MON = new WeekDays();
  public String toString()
 {
  return this == SUN ? "sun" : "mon";
 }
}
枚举要限定对象实例的数量,要外面不能new,所以构造方法写成private,
WeekDays类中定义了2个static final的实例,SUN,MON,就是表示模拟枚举类中只能引用2个实例,
类中还可以定义自己的方法nextDay(),重写了toString方法。

看下面也是同样可以在类中定义抽象的方法,让每个类的实例去单独的实现:
private WeekDays(){}
    public static final WeekDays SUN = new WeekDays(){
    @Override
  public WeekDays nextDay()
  {
   
   return MON;
  }};
    public static final WeekDays MON = new WeekDays(){

  @Override
  public WeekDays nextDay()
  {
   
   return SUN;
  }};
    public abstract WeekDays nextDay();
   
 用抽象类和抽象方法把上面nextDay()方法中大量的if-else语句转移成一个个独立的类的具体实现了。 
还有,如果枚举中只有一个成员就可以作为一种单例的实现方式,相信大家都能理解。好了,有关java的
枚举就介绍到这里了,谢谢。

---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 高铁买了学生票没带学生证怎么办 买的学生票超过区间怎么办 买了超过区间的学生票怎么办 火车票大于学生票购买区间怎么办 买了学生票学生证丢了怎么办 取票学生证没带怎么办 学生卡的失磁怎么办 学生证没有充磁买不了学生票怎么办 买学生票不在优惠区间怎么办 火车票学生优惠次数用完怎么办 学生乘火车优惠磁卡丢了怎么办 磁卡锁的卡丢了怎么办 电梯磁卡扣丢了怎么办 买火车票手机号填错了怎么办 买火车票乘客身份核验失败怎么办 火车票不在一个车厢怎么办站票 坐火车丢东西了怎么办 g2坐过站了怎么办 坐火车买近了怎么办 打印的纸质火车票丢失怎么办 格力空调没保修单怎么办 格力空调不兑现保修怎么办 哈空调如果退市怎么办 空调保修单丢了怎么办 海尔空调发票丢了怎么办 格力空调发票丢了怎么办 联程航班第一程延误怎么办 飞机经停10小时怎么办 去车站买票没带身份证怎么办 转机航班第一班延误了怎么办 转机航班第一班取消了怎么办 香港转机大陆行李托运怎么办 联程车票第一班车晚点怎么办 到了普吉机场接机怎么办 被骚扰电话打个不停怎么办 网贷不停发信息怎么办 网贷天天发信息怎么办 诈骗电话一直打个不停怎么办 寄快递电话号码写错了怎么办 寄快递收件人号码错了怎么办 嫒和媛分不清楚怎么办