一些程序在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,jdk5以前采用自定义类来解决,jdk5以后可以直接采用枚举来解决
枚举的特性
1、枚举是一种特殊形式的java类
2、枚举类中声明的每一个枚举值代表枚举类的一个实例对象
3、与java中的普通类一样,在声明枚举;类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须为私有的
4、枚举类也可以实现接口或继承抽象类
5、jdk5中扩展了switch语句,它除了可以接收int,byte,char,short外,还可以接收一个枚举类型
用法一:常量
在jdk1.5之前,我们定义常量都是:public static final….。jdk1.5出现以后,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
enum Grade{ //Class
A,B,C,D; //Object
}
用法二:switch
jdk1.6之前的switch语句只支持int,byte,char,short,enum类型。
enum Grade{
A,B,C,D;
}
public class Demo{
Grade grade=Grade.A;
public void test(){
switch(grade){
case A:
grade=Grade.A;
break;
case B:
grade=Grade.B;
break;
case C:
grade=Grade.C;
break;
case D:
grade=Grade.D;
break;
}
}
}
用法三:向枚举中添加新方法
如果打算定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且java要求必须先定义enum实例。
enum Grade{
A("100-80"),B("79-70"),C("69-60"),D("59-0");
//成员变量
private String value;//封装每个对象对应的分数
//构造方法
public Grade(String value){
this.value=value;
}
//普通方法
public static String getName(int index){
for(Grade g:Grade.values()){
if(g.getValue()==value){
return g.value;
}
}
return null;
}
//get set方法
public String getValue(){
return this.value;
}
public void setValue(){
this.value=value;
}
}
用法四:覆盖枚举的方法
下面是一个toString()方法覆盖的例子
public class Demo{
enum Grade{
A("100-80"),B("79-70"),C("69-60"),D("59-0");
//成员变量
private String value;
//构造方法
private Grade(String name){
this.value=value;
}
//覆盖方法
@Override
public String toString(){
return this.value;
}
}
public static void main(String[] args){
System.out.println(Grade.A.toString());
}
}
用法五:实现接口
所有的枚举都继承自java.lang.Enum类。由于java不支持多继承,所以枚举对象不能再继承其他类。
public interface Behaviour {
void print();
String getInfo();
}
public enum Grade implements Behaviour {
A("100-80"),B("79-70"),C("69-60"),D("59-0");;
// 成员变量
private String value;
// 构造方法
private Grade(String value) {
this.value= value;
}
// 接口方法
@Override
public String getInfo() {
return this.value;
}
// 接口方法
@Override
public void print() {
System.out.println(this.value);
}
}
用法六:使用接口组织枚举
public interface Food {
enum Coffee implements Food {
BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO
}
enum Dessert implements Food {
FRUIT, CAKE, GELATO
}
}
用法七:
java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的key是enum类型,而value则可以是任意类型,具体可以参考JDK API文档。
枚举和常量定义的区别
1、通常定义常量的方法
通常利用public final static方法定义的代码如下,分别用1表示A,2表示B,3表示C。
public class Grade{
/*A*/
public final static int A = 1;
/*B*/
public final static int B = 2;
/*c*/
public final static int c = 3;
}
2、枚举类型定义常量方法
枚举类型的简单定义方法如下:
enum Grade{
A,B,C;
}