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("秋天"),
;
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;
}
},
public calculate(double a, double b) {
return a-b;
}
},
public calculate(double a, double b) {
return a*b;
}
},
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);
}