天天看点

Java Enum 枚举详解

在某些情况下,一个类的对象是有限而固定的。比如季节类,它只有4个属性。像这种实例有限且固定的类,被称为枚举类。没错,它仍然是一个类,具有类所有的特性。

下面就开始创建一个枚举类吧:

**

  • 无法创建枚举文件的问题

**

new>Enum

哎呀,结果发现创建的时候无法创建(如果你用的是eclipse),如下图:

Java Enum 枚举详解

这是因为Eclipse可以指定编译深度,默认值为1.4,而枚举是在jdk1.5之后出现的。需要去修改:Project>proterties>Java Compiler。然后去修改,如图:

Java Enum 枚举详解

然后应用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。

总之,枚举也是类。就好像正方形也是矩形一样。