枚举:即规定好的取值范围所有的内容只能从指定范围内取得。
1、Java中两种方式定义新类型:类和接口。
类 | 接口 |
class Color { public static final Color RED=new Color("红色"); public static final Color GREEN=new Color("绿色"); public static final Color BLUE=new Color("蓝色"); private String name; private Color(String name){ this.setName(name); } public String getName(){ return name; }
public void setName(String name){ this.name=name;
} public static Color getInstance(int i){ switch(i){ case 1:{ return RED; } case 2:{ return GREEN; } case 3:{ return BLUE; } default:{ return null; } } } } | public interface Color { public static final int RED=1; public static final int GREEN=2; public static final int BLUE=3; } |
2、enum关键字定义枚举类型:public enum 枚举类名{ 枚举对象1,...枚举对象n;}
使用:枚举.variable形式取出枚举中指定内容。
枚举.values()形式将全部枚举类型变为对象数组形式,之后直接使用foreach进行输出。
可以将内容直接在switch 语句上使用。但是一定不能在每个枚举类型值前面加上枚举类型的类型名(如:Color.BLUE)否则编译错误。
3、Enum类:使用enum声明的枚举类型相当于定义一个类,此时默认继承java.lang.Enum类。Enum类实现了Comparable和Serializable两个接口,证明枚举类型可以使用比较器和进行序列化操作。
Protected Enum(String name,int ordinal):构造方法接收的两个参数为枚举的名称和枚举序号(从0开始依次编号)。枚举类建立完成后,实际上会默认调用Enum类的构造方法,为其赋值。
在枚举定义属性及自己的构造方法时,一旦定义有参构造之后,在声明枚举对象时就必须明确调用构造方法并传递参数。
enum Color{ RED("红色"),GREEN("绿色"),BLUE("蓝色");
private Color(String name){ this.setName(name); } private String name; public String getName(){
return name; } public void setName(String name){ this.name=name; } } |
除了通过“枚举类.枚举对象”形式取得每个枚举对象,也可以通过Enum类定义的“枚举类.valueOf()”方法根据名字获得对象。
Color c=Enum.valueOf(Color.class,"BLUE"); |
Enum类实现了Comparable接口,枚举类的内容本身可以进行排序(按照ordinal属性排序)
4、类集对枚举的支持---EnumMap、EnumSet
<1>、EnumMap是Map接口的子类,本身可以以Map的形式进行操作(即”key->value”)。
Map<枚举类1,String> 对象名=new EnumMap<枚举类1,String>(枚举类.class)
<2>、EnumSet是Set接口的子类,里边的内容无法重复。使用EnumSet时不能直接使用关键字new为其进行实例化,而是使用本类中提供的静态方法。(EnumSet<枚举类名> 对象名=null;)
静态方法:对象名=EnumSet.allOf(枚举类名.class);--将枚举类中的全部内容设置到EnumSet集合中。
对象名=EnumSet.Of(枚举类名.枚举对象);--将枚举类中的一个内容设置到EnumSet集合中。
对象名=EnumSet.noneOf(枚举类名.class);--将集合设置成只能增加指定枚举类型的集合,但并不设置任何的内容到集合中。
对象名=EnumSet.complementOf(同一枚举类的其他EnumSet对象old);--创建不包含old中元素的集合。
5、枚举类实现一个接口:枚举类也可以实现一个接口,因为接口中存在抽象方法,所以枚举类中的每个对象都必须实现接口中的抽象方法。
6、枚举类中定义抽象方法:枚举类中也可以定义抽象方法,但每个枚举的对象都必须实现此抽象方法。
7、