Java基础知识07--枚举类型Enum的使用

1.枚举的概述

JDK1.5引入了新的类型——枚举。

Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。

Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。

创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum>,而 E 表示枚举类型的名称。

所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。

values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:

  • values() 返回枚举类中所有的值。
  • ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
  • valueOf()方法返回指定字符串值的枚举常量。

2.枚举型常量

枚举类:

public enum SeasonEnum {
   //每个成员变量都是final static修饰
    SPRING,SUMMER,AUTUMN,WINTER
}

测试类:

public class SeasonTest {
    public static void main(String[] args) {
        for (SeasonEnum seasonEnum : SeasonEnum.values()) {
            System.out.println(seasonEnum+",ordinal:"+seasonEnum.ordinal()+",name:"+seasonEnum.name());
        }
    }
}

控制台输出:

SPRING,ordinal:0,name:SPRING
SUMMER,ordinal:1,name:SUMMER
AUTUMN,ordinal:2,name:AUTUMN
WINTER,ordinal:3,name:WINTER

3.带一个参数的枚举

SeasonEnum 枚举类有了chinese这个成员变量,所以我们在定义实例对象时就要维护这个chinese成员变量。

枚举类:

public enum SeasonEnum {
    //枚举类的实例对象必须在最前面先定义,而且必须每个实例对象都必须维护上chinese成员变量
    SPRING("春天"),SUMMER("夏天"),AUMUTN("秋天"),WINTER("冬天");

    private String chinese;

    //枚举类型的构造函数默认为private,因为枚举类型的初始化要在当前枚举类中完成。
    SeasonEnum (String chinese){
        this.chinese= chinese;
    }

    public String getChinese(){
        return chinese;
    }

}

测试类:

public class SeasonTest {
    public static void main(String[] args) {
        //直接初始化
        SeasonEnum season1 = SeasonEnum.SPRING;
        //调用SeasonEnum枚举类的getChinese()方法获取SPRING的中文值
        System.out.println(season1.getChinese());

    }
}

控制台输出:

春天

4.带两个参数的枚举

在枚举类中增加了name/code两个属性,并重新编写了构造方法。

枚举类:

public enum SeasonEnum {
    //枚举类的实例对象必须在最前面先定义
    SPRING("春天",1201),
    SUMMER("夏天",1202),
    AUMUTN("秋天",1203),
    WINTER("冬天",1204);

    private String name;
    private Integer code;

    //枚举类型的构造函数默认为private,因为枚举类型的初始化要在当前枚举类中完成。
    SeasonEnum (String name,Integer code){
        this.name=name;
        this.code=code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    @Override
    public String toString() {
        return this.name()+"("+this.code+")";
    }
}

测试类:

public class SeasonTest {
    public static void main(String[] args) {
        //直接初始化
        SeasonEnum season1 = SeasonEnum.SPRING;
        System.out.println(season1.getName());
        System.out.println(season1.toString());

    }
}

控制台输出:

春天
SPRING(1201)

5.枚举类中定义抽象方法

既然编译器最终将每个枚举值声明为枚举类的实例,那我们能在枚举类中声明抽象方法让枚举值去实现么?

在枚举类Season中声明了一个抽象方法sayHello()。然后在创建枚举值时,就必须实现该抽象方法。

枚举类:

public enum SeasonEnum {
    //枚举类的实例对象必须在最前面先定义,而且必须每个实例对象都必须维护上chinese成员变量
    SPRING("春天",1201){
        @Override
        void sayHello() {
            System.out.println("hello spring");
        }
    },
    SUMMER("夏天",1202){
        @Override
        void sayHello() {
            System.out.println("hello summer");
        }
    },
    AUTUMN("秋天",1203){
        @Override
        void sayHello() {
            System.out.println("hello autumn");
        }
    },
    WINTER("冬天",1204){
        @Override
        void sayHello() {
            System.out.println("hello winter");
        }
    };

    private String name;
    private Integer code;

    //枚举类型的构造函数默认为private,因为枚举类型的初始化要在当前枚举类中完成。
    SeasonEnum (String name,Integer code){
        this.name=name;
        this.code=code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    abstract void sayHello();
}

测试类:

public class SeasonTest {
    public static void main(String[] args) {
        //直接初始化
        SeasonEnum season1 = SeasonEnum.SPRING;
        //调用SeasonEnum枚举类的sayHello方法
        season1.sayHello();
    }
}

控制台输出:

hello spring

 

参考文献:https://blog.csdn.net/qq_27093465/article/details/52180865

https://blog.csdn.net/sihai12345/article/details/81070174(重点参考)

https://zhuanlan.zhihu.com/p/64605561

posted @ 2021-08-27 17:32  雨后观山色  阅读(314)  评论(0编辑  收藏  举报