一、概述
1.枚举定义
枚举是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。
枚举类可以有多个实例,但不是无限个数的实例,而是有限个数的实例。
所以在这里我们可以自定义实现一个简单的枚举类
public class Direction {
//定义枚举类的实例
public static final Direction FRONT = new Direction();
public static final Direction RIGHT = new Direction();
public static final Direction BACK = new Direction();
public static final Direction LEFT = new Direction();
//实现构造私有,保证不能无限的创建实例
private Direction(){
}
}
可以看出这里的构造方法必须是私有的,保证不会创建无限的实例
但是如果在枚举类中加入了变量和构造方法
public class Direction {
//定义枚举类的实例
public static final Direction FRONT = new Direction("前");
public static final Direction RIGHT = new Direction("右");
public static final Direction BACK = new Direction("后");
public static final Direction LEFT = new Direction("左");
//实现构造私有,保证不能无限的创建实例
// private Direction(){
//
// }
private String name;
//加入成员变量,并去掉无参构造
private Direction(String name){
this.name = name;
}
public String getName(){
return name;
}
}
因为不会再使用无参构造方法,所以创建的实例也必须跟随改变
再者如果其中加入了抽象方法
public abstract void show();
这时创建的类需要更改为抽象类,其子类实现抽象方法
public abstract class Direction {
//定义枚举类的实例
public static final Direction FRONT = new Direction("前"){
@Override
public void show(){
System.out.println("前");
}
};
public static final Direction RIGHT = new Direction("右"){
@Override
public void show(){
System.out.println("右");
}
};
public static final Direction BACK = new Direction("后"){
@Override
public void show(){
System.out.println("后");
}
};
public static final Direction LEFT = new Direction("左"){
@Override
public void show(){
System.out.println("左");
}
};
//实现构造私有,保证不能无限的创建实例
// private Direction(){
//
// }
private String name;
//加入成员变量,并去掉无参构造
private Direction(String name){
this.name = name;
}
public String getName(){
return name;
}
public abstract void show();
}
而对于其测试类
public class DirectionDemo {
public static void main(String[] args) {
//这里其实采用了多态的向上转型
Direction d = Direction.FRONT;
//没有写toString方法
System.out.println(d);//enums.Direction$1@130a7be0
System.out.println(d.getName());//前
d.show();//前
}
}
2.用JDK5中的枚举来做枚举类
最简单的方式
public enum Directions {
//其实现的方式跟自定义的实例是同种方式
FRONT,BACK,LEFT,RIGHT;
}
而且测试类中
public class DirectionsDemo {
public static void main(String[] args) {
Directions d = Directions.FRONT;
//其输出的并不是地址值
System.out.println(d);//FRONT
}
}
因为Directions类已经继承了Enum类,而这个所有枚举类的基本类中有toString方法
public String toString()返回枚举常量的名称,它包含在声明中。
则如果在类中添加变量和构造方法,则最简单的方式会报错,如同自定义的枚举类一样
public enum Directions {
//其实现的方式跟自定义的实例是同种方式
FRONT("前"),BACK("后"),LEFT("左"),RIGHT("右");
private String name;
private Directions(String name){
this.name = name;
}
public String getNname(){
return name;
}
}
如果在枚举类中加入抽象方法
public abstract enum Directions {
//其实现的方式跟自定义的实例是同种方式
FRONT("前"){
@Override
public void show(){
System.out.println("前");
}
},BACK("后"){
@Override
public void show(){
System.out.println("后");
}
},LEFT("左"){
@Override
public void show(){
System.out.println("左");
}
},RIGHT("右"){
@Override
public void show(){
System.out.println("右");
}
};
private String name;
private Directions(String name){
this.name = name;
}
public String getNname(){
return name;
}
public abstract void show();
}
所以其中的实现方式和自定义的方式一致,但是枚举类在加入抽象方法后,类的声明不可以加abstract。
二、注意事项
1.所有枚举类都是Enum的子类
2.枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略
3.枚举类可以有构造器,但必须是private的,它默认的也是private的
4.枚举类也可以有抽象方法,但是枚举项必须重写该方法
5.枚举可以在switch语句中的使用