Java之枚举篇

来源:互联网 发布:人物画像 数据 编辑:程序博客网 时间:2024/05/14 13:18

出处:http://blog.csdn.net/snowcoldy/article/details/6744015

1、为什么要出现枚举:
在现实生活中,有许多实体有且仅有特定的几个属性(例如:月份只有1~12月,性别只有男女,季节只有四季……等)
若将其类型定义成常量,则不可避免地出现非法参数的问题(例如:13月,第三个性别,第五个季节……等)
因此,对于上述类型的对象,必须规定其特定的属性值为枚举类型,即:仅能从已有的几个值中挑选,不可以自己创建新的属性值
 
2、枚举的关键概念:
用户若想要创建某个对象
只能从已有的该类型对象里面挑选
不能自己自由创建新的该类型对象
例如:用户若想要一个季节类型的对象
则只能从已有的春夏秋冬四个类型的对象里挑选
而不能创建新的季节类型对象
 
*枚举类的原始实现:
(1)定义一个类,里面包含若干个public static final修饰的,自身类型的变量以供外界使用
(2)构造方法私有(即:不可以由外界创建新的对象)
例如:
class Season() {
  public static final Season SPRING = new Season();
  public static final Season SUMMER = new Season();
  public static final Season AUTUMN = new Season();
  public static final Season WINTER = new Season();
  private Season() {}
}
 
*这样,外界只要把一个变量定义成Season类
那么这个变量除了取春夏秋冬中任一个值外,不能取任何其它值
 
3、枚举类在JDK5.0中的实现:
enum Season() {SPRING,  SUMMER,  AUTUMN,  WINTER}
此语法与上述原始实现的作用完全等同,且同样是编译器语法,即:
编译器在遇到上述语句的时候,会自动将其转换成之前原始实现的格式
*因此,枚举在本质上仍然是一个特殊的类,只不过这个类:
(1)内部包含该类的公开静态常量对象
(2)构造方法必须是私有的
 
4、枚举类的父类:Enum
常用方法:
values()  //静态方法,返回该枚举类的数组,内容为该类中所有的枚举值
 
5、枚举类作为一个特殊的类的理解:
枚举除了可以定义该类的公开静态常量对象之外
还可以定义任何另外的属性和方法,
只是在添加属性和方法的时候,需要在枚举值的最后一个值后面加上分号
例如:
enum Season() {
  SPRING("春天"), 
  SUMMER("夏天"), 
  AUTUMN("秋天"), 
  WINTER("冬天");
 
  String name;
  Season(String name) {this.name = name} 
  //注意:枚举类的构造方法仅能是private的,即使不用private修饰,也会自动默认为private
  public String getName() {return name;}
}
 
6、枚举类不可以有子类,但是枚举类中的枚举值可以实现枚举类中的抽象方法
例如:
 
//定义枚举类型
enum Operator {
  ADD {
    public calculate(double a, double b) {
      return a+b;
    }
  },
  SUB {
    public calculate(double a, double b) {
      return a-b;
    }
  },
  MUL {
    public calculate(double a, double b) {
      return a*b;
    }
  },
  DIV  {
    public calculate(double a, double b) {
      return a/b;
    }
  };
  public abstract double calculate(double a, double b);
}
 
//调用该枚举类
Operator [] os = Operator.values();
for(Operator o:os) {
  o.calculate(8,2);
}
0 0