在某些情况下,一个类的对象是有限而固定的。比如季节类,它只有4个属性。像这种实例有限且固定的类,被称为枚举类。没错,它仍然是一个类,具有类所有的特性。
下面就开始创建一个枚举类吧:
**
- 无法创建枚举文件的问题
**
new>Enum
哎呀,结果发现创建的时候无法创建(如果你用的是eclipse),如下图:
这是因为Eclipse可以指定编译深度,默认值为1.4,而枚举是在jdk1.5之后出现的。需要去修改:Project>proterties>Java Compiler。然后去修改,如图:
然后应用ok。
接下来创建一个Colo枚举类,有三个实例对象
public enum Color {
RED,GREEN,BLUE;
}
在枚举类中有三个实体类对象。
1.而且它们只能被写在第一行,否则这些实体对象无效。
2.枚举类继承的是Enum类,不可以显示去继承其它类,而Enum类实现了Serializable和Comparable接口
3.如果枚举类是非抽象的,那么它不能被继承
- switch语句同样提供了对枚举类的支持:
public class Test {
public static void main(String[] args) {
//调用test方法并传递BLUE对象
test(Color.BLUE);
}
/**
*
* @param c 枚举类对象
*/
public static void test(Color c) {
switch (c) {
case RED:
System.out.println("红");
break;
case BLUE:
System.out.println("蓝");
break;
case GREEN:
System.out.println("绿");
break;
default:
break;
}
}
}
可以看出,在switch语句中,可以直接写对象名称,不用通过类名点出。
**
- 枚举类也是类
**
枚举类也是一种类,里面同样可以有成员变量、方法、构造方法。
- 枚举类中成员变量:
public enum Color {
RED,GREEN,BLUE;
public String name;
}
使用:
public class Test {
public static void main(String[] args) {
Color.BLUE.name="蓝色";
System.out.println(Color.BLUE.name);
}
}
输出:蓝色
和普通类对象的用法没有区别。
- 成员方法:
public enum Color {
//三个实体类对象
RED,GREEN,BLUE;
//成员变量
public String name;
/**
* 成员方法
* @param str
*/
public void eat(String str){
System.out.println(str);
}
}
调用:
public class Test {
public static void main(String[] args) {
Color.BLUE.eat("不能吃");
}
}
- 构造方法
public enum Color {
//三个实体类对象,此处的枚举值,必须调用构造方法来创建(因为只有一个构造方法)
RED("红色"),GREEN("绿色"),BLUE("蓝色");
//成员变量
public String name;
//有参构造方法
private Color(String name) {
this.name = name;
}
/**
* 成员方法
* @param str
*/
public void eat(String str){
System.out.println(str);
}
}
和普通类一样,写了什么构造方法,就只能用哪个构造方法。
- 枚举类实现接口
public enum Color implements Runnable{
//三个实体类对象,此处的枚举值,必须调用构造方法来创建(因为只有一个构造方法)
RED,GREEN,BLUE;
//重写接口的方法
@Override
public void run() {
}
}
可以看到,和普通类的继承没什么区别,但是每个对象所执行的重写的方法都是一样的,做的事情也就是一样的。很多情况下,我们的需求是不同的对象,处理不同的数据,那就要分别去重写这些方法。
public enum Color implements Runnable{
//这是一个通过匿名内部类得到的对象
RED{
@Override
public void run() {
System.out.println("红光");
}
}
,GREEN{
@Override
public void run() {
System.out.println("绿光");
}
}
,BLUE{
@Override
public void run() {
System.out.println("蓝光");
}
};
}
这个时候的枚举类Color并没有重写接口的抽象方法,那么Color就是一个抽象的枚举类,可以通过子类对象获得具体实例。
调用:
public class Test {
public static void main(String[] args) {
Color.BLUE.run();
}
}
输出:蓝光
专门用来保存枚举实体类对象的集合有EnumSet和EnumMap。
总之,枚举也是类。就好像正方形也是矩形一样。