Java Enum 枚举详解

来源:互联网 发布:linux进入grub界面 编辑:程序博客网 时间:2024/06/06 21:43

在某些情况下,一个类的对象是有限而固定的。比如季节类,它只有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。
总之,枚举也是类。就好像正方形也是矩形一样。