简介

  • 先看一个简单的枚举类型

    public enum SeasonEnum {
        SPRING,SUMMER,FALL,WINTER;
    }
    
  • enum其实和class地位一样。
  • 枚举类默认继承java.lang.Enum而非Object类。
  • 枚举类可以继承一个或多个接口。
  • 上面的四个季节其实就是SeasonEnum的四个实例,自动被添加public static final修饰,默认调用构造器。不可以再创建新的实例
  • 由于枚举类的实例在类内创建,构造器只允许在类内调用,因此必须声明为private。
  • 非抽象的枚举类默认被final修饰,不可以被继承。
  • 枚举类也可以有自定义属性和方法(静态与否无妨)。

    public enum SeasonEnum {
        //创建实例,调用构造器(这里要求传入字符串);必须写在第一行
        SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天");
    
        //自定义属性;枚举类通常应该设计成不可变类,它的field不应该被改变,这样会更安全
        private final String name;
    
        //构造器
        private SeasonEnum(String name)
        {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    }
    

    常用方法

  • toString(): 继承自Enum类,返回枚举常量(枚举值)名。
SeasonEnum.SPRING.toString() //返回SPRING
  • valueOf(): 静态方法,toString()的逆方法,将字符串包装成枚举类。
SeasonEnum season=(SeasonEnum)Enum.valueOf(SeasonEnum.class,"SPRING"); //将season包装为SeasonEnum.SPRING
  • values(): 每个枚举类型都包含的静态方法,返回一个包含全部枚举值的数组
SeasonEnum[] values=SeasonEnum.values();

枚举类实现接口

  • 与普通类一样,枚举类实现接口的时候如果没有重写所有方法,那这个枚举类就是抽象的,只是不需要显式加上abstract修饰。
public enum Operation {
    //枚举值实现抽象方法
    PLUS{

        @Override
        public double eval(double x, double y) {
            return x + y;
        }

    },

    TIMES{

        @Override
        public double eval(double x, double y) {
            return x * y;
        }

    },

    /**
     * 抽象方法,由不同的枚举值提供不同的实现。
     */
    public abstract double eval(double x, double y);

    public static void main(String[] args) {
        System.out.println(Operation.PLUS.eval(10, 2));
        System.out.println(Operation.TIMES.eval(10, 2));
    }
}

switch语句里的表达式可以是枚举值

  • case表达式可以直接写枚举值,而不需加入枚举类作为限定。

    public class SeasonTest {
        public void judge(SeasonEnum s)
        {
            switch(s)
            {
            case SPRING:
                System.out.println("春天适合踏青。");
                break;
            case SUMMER:
                System.out.println("夏天要去游泳啦。");
                break;
            case FALL:
                System.out.println("秋天一定要去旅游哦。");
                break;
            case WINTER:
                System.out.println("冬天要是下雪就好啦。");
                break;
            }
        }