定义:
枚举是指一组固定常量组成合法值的类型
首先是固定常量,一组有限常量集,比如一年的四个季节,太阳系的行星。其次,枚举是一种特殊的类型,定义了自己的一些规则,这些规则是建立在类规则之上的,是一种 type。
性质:
枚举是真正的 final,客户端不允许创建枚举类的实例,也不能对其进行拓展
Java 枚举本质上是 int 值。只能通过公有的静态 final 域为枚举类导出实例。
public enum Color {
GREEN,RED,BLUE,GRAY;
}
实际上枚举的完整的结构为:
public enum Color {
GREEN,RED,BLUE,GRAY;
Color() {
}
如果在 Color() 构造方法之前加上 private 则不会有任何问题。如果加上 public 等修饰符,IDE 会报错,也就是编译器不会通过。其实这是枚举与类的根本区别,就在于构造方法私有。
当然如果仅仅是构造方法私有,不再提供构造方法了,也就是说外界不能 new 实例,如果仅从这样看,那枚举就没有什么用了。
其实我们用过枚举的都知道,GREEN、RED 都是 Color 型的实例,其实枚举也可以看作自动处理了一些东西,帮助简化了代码,翻译成类大致就是:
public class Color {
public static final Color GREEN = new Color(),
RED = new Color(),
BLUE = new Color(),
GRAY = new Color();
private Color() { }
}
如果从这种角度去看,枚举的用法就不难理解了,也就是枚举类不给外界实例化的机会,只能它自己实例化,而一个枚举类的所有实例就只有枚举前面分号前的那几个,其他地方不允许创建。
既然前面说了枚举把构造方法私有化了,默认的分号前面的都自动 new 出实例了,然后枚举和一般的类用法上也就没别的太大的区别了。比如枚举里声明一个抽象方法,前面的每个实例就必须要实现,代码:
public enum Color {
GREEN {
@Override
void draw() {
}
},RED {
@Override
void draw() {
}
},BLUE {
@Override
void draw() {
}
},GRAY {
@Override
void draw() {
}
};
Color() {
}
abstract void draw();
}
如果要实现一个接口:
public interface IDarw {
void draw();
}
枚举:
public enum Color implements IDarw {
GREEN {
@Override
public void draw() {
}
},
RED {
@Override
public void draw() {
}
},
BLUE {
@Override
public void draw() {
}
},
GRAY {
@Override
public void draw() {
}
};
Color(){}
}
其实只要知道枚举翻译成类的样子,这些用法就很好懂了。
然后比如声明什么变量,或者构造方法加参数,或者加一些方法,都和类用法一样。前面几个是实例,写在枚举类里面的的就相当于类的代码,有抽象方法就要在实例里实现一下,就这么简单。其他的用法也就是类和实例的关系,没什么特别了。