1.定义枚举类用关键字enum来修饰类,然后在该类里面直接添加相应的对象名称即可,如:
enum Fruit{
APPLE,ORANGE,BANANA;
}
用关键字enum来修饰一个类后,其实该类就默认继承了java.lang.Enum类,也就会默认调用该类的构造方法,因此枚举类本身无需重新定义构造方法,当然也可以自定义;
完成定义后,就可以进行枚举的对象调用,调用方式如下:
Fruit fruit1 = Fruit.APPLE;
Fruit fruit2 = Fruit.ORANGE;
Fruit fruit3 = Fruit.BANANA;
System.out.println(fruit1.name());
System.out.println(fruit2.name());
System.out.println(fruit3.name());
这里枚举类内每个类型对象的名字就是他本身的变量名,如果要进行另定义名字,则可以在定义枚举类的时候另附名:
enum Fruit{
APPLE("苹果"),ORANGE("桔子"),BANANA("香蕉");//这时,对象初始化需要按照自定义的构造函数来
private String name = "";
private Fruit(String name){
this.name = name;
}
public String getName(){
return name;
}
}
这时可以用如APPLE.getName()的方法来去的自定义名字。
注:由于Enum类中的name()方法是finnal定义的,因此无法重写,因此如果调用name()方法还是返回变量名;
2.列举遍历枚举类型。
运用values()方法,即可获得枚举中的所有类型对象:
for(Fruit f:Fruit.values()){
System.out.println(f.name());
}
这里的values()方法是属于枚举类型预定义函数,是在java.lang.annotation.ElementType下的一个函数,返货枚举对象数组。
3.由于Enum类实现了Comparable接口,所以可以对他进行自动排序,默认是按照对象变量名进行排序的,因为在Enum类中,已经把compareTo()函数定义为final类型,因此无法再次实现接口以及重写重写函数了,只能按照父类的排序规定:
Set<Fruit> fset = new TreeSet<Fruit>();//排序类集
fset.add(Fruit.APPLE);
fset.add(Fruit.BANANA);
fset.add(Fruit.ORANGE);
Iterator<Fruit> it = fset.iterator();
while(it.hasNext()){
System.out.println(it.next().name());
}
4.对枚举类型的类集操作,除了像上面中的那样常规操作,类集有对枚举的特别支持,可以整体性的对枚举类型进行添加:
Set<Fruit> fset =EnumSet.allOf(Fruit.class);
Iterator<Fruit> it = fset.iterator();
while(it.hasNext()){
System.out.println(it.next().name());
}
EnumSet没有构造方法,用allOf来返回对象;当然也可以通过public static <E extendsEnum<E>>EnumSet<E>of(E e)方法来进行单个元素的添加并返回类集对象;或者用public static <E extendsEnum<E>>EnumSet<E>noneOf(Class<E> elementType)方法返回空集合对象,并后续用add()来添加元素。(更多方法可以参考EnumSet类文档)。
此外还有一个EnumMap也是对枚举类的支持,操作与上类似,这里不再具体介绍。
5.对于枚举类要继承接口或者定义抽象函数,必须对于枚举类中每个对象实现抽象函数:
interface Print{
public void show();
};
enum Fruit implements Print{
APPLE("苹果"){
public void show(){
System.out.println(getName());
}
},ORANGE("桔子"){
public void show(){
System.out.println(getName());
}
},BANANA("香蕉"){
public void show(){
System.out.println(getName());
}
};
private String name = "";
private Fruit(String name){
this.name = name;
}
public String getName(){
return name;
}
};
至此,完成每个对象对接口的不同实现。