黑马程序员-java-枚举

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

你可能感兴趣的:(黑马程序员-java-枚举)