关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组建使用。
枚举类型的定义
定义枚举类使用关键字enum(定义类使用class),后面紧跟类名。例子:
public enum Shrubbery{
A,B,C
}
其中A,B,C是这个枚举类的实例,即这个枚举类有哪些实例是在定义这个枚举类的时候就定义好的,在别的地方不能在创建这个枚举类的实例。
基本枚举类的特性
当我们定义一个枚举类时,编译器会自动将这个枚举类继承java.lang.Enum类。就我们定义一个普通类一样(class A),如果没有明确指明这个类A的父类,那这个类A继承Object类.实际上java.lang.Enum也继承Object类。Enum类还实现了Comparable和Serializable接口。Enum类除了具有Object类和Comparable及Serializable接口的方法外还具有values()方法,Object类以及Comparable和Serializable接口都没有这个方法,在Enum中也没有这个方法,那这个方法哪里来的?这个编译器给Enum类加上的static方法,除了加了这个方法,还加了一个带一一个参数的valueOf()方法(Enum类本身有一个带有两个参数的方法)。
- values()方法返回这个枚举类的数组。
- valueOf(Class ,String)方法更具名字返回这个枚举类的实例,如果不存在就会抛出异常。
- ordinal()方法返回当前枚举实例在他的枚举类中定义的顺序。从0开始。
- getDeclaringClass()返回这个枚举对象所属类的类名。
- getEnumConstants()返回当前枚举类的所有实例。此方法其实属于Class类的方法,但如果是普通类(class)调用次方法就会返回null。
由于我们定义的枚举类继承了Enum类,Java中只允许单根继承,所以我们定义的枚举类不能在继承其他任何类,但可以实现接口。
向枚举类中添加新的方法或域
如果向枚举类中添加方法或域时,定义的顺序一定是枚举实例,中间用,隔开,且最后一个枚举实例的最后一定要加上;。
添加构造方法和域
public enum Shrubbery{
A("name is A"),B("name is B"),C("name is C");
private String description;
private Shrubbery(String description){
this.description=description;
}
public String getDescription(){
return description ;
}
}
可以这样调用
Shrubbery.A.getDescription();
这里特意把构造方法设置成private,也可以定义为public ,但如果在改枚举类外调用构造方法,编译器会报错。因为枚举类的实力在定义改枚举类时就已经定义好了,不能在其他地方创建枚举类的实例了。
添加抽象方法
public enum Shrubbery{
A{
String getInfo(){
return "name is A"
}
},
B{
String getInfo(){
return "name is A"
}
},
C{
String getInfo(){
return "name is A"
}
};
abstract String getInfo();
}
有抽象方法时,每个枚举实例都要实现这个抽象方法。
覆盖枚举类方法
我们定义的枚举类也可以覆盖基类的方法,如toString()方法。
public enum Shrubbery{
A,B,C;
public String toString(){
return "name is "+name();
}
}