【java基础】枚举类

我不是女神ヾ 2023-07-22 09:09 125阅读 0赞

定义

在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象;再比如行星类,目前只有8个对象。这种实例有限而且固定的类,在Java里被称为枚举类。

Java5新增一个enum关键字(它与class,interface关键字的地位相同),用以定义枚举类。枚举类是一个特殊的类,它一样可以有自己的成员变量、方法,可以实现一个或者多个接口,也可以定义自己的构造器。一个java源文件中最多只能定义一个public访问权限的枚举类,且该Java源文件也必须和该枚举类的类名相同。

枚举类和普通类有如下区别

  1. 枚举类可以实现一个或者多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是默认继承Object类,因此枚举类不能显示继承其他父类。其中java.lang.Enum 类实现了java.lang.Serializable和java.lang.Comparable两个接口。
  2. 使用enum 定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类。
  3. 枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private修饰符
  4. 枚举类的所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无序程序员显示添加。

定义枚举类是,需要显式列出所有的枚举值,如下面代码实例所示,所以的枚举值时间以英文逗号(,)隔开,枚举值列举结束后以英文分号作为结束。这些枚举值代表了该枚举类的所有可能的实例。

  1. public enum SeasonEnum {
  2. //在第一行列出4个枚举实例
  3. SPRING,SUMMER,FALL,WINTER
  4. }

枚举类实例

  1. EnumTest
  2. public class EnumTest {
  3. public void judge(SeasonEnum s) {
  4. switch (s) {
  5. case SPRING:
  6. System.out.println("春暖花开,真好踏青");
  7. break;
  8. case SUMMER:
  9. System.out.println("夏日炎炎,适合游泳");
  10. break;
  11. case FALL:
  12. System.out.println("秋高气爽,进步及时");
  13. break;
  14. case WINTER:
  15. System.out.println("冬日雪飘,围炉赏雪");
  16. break;
  17. }
  18. }
  19. public static void main(String[] args) {
  20. for (SeasonEnum s : SeasonEnum.values()){
  21. System.out.println(s);
  22. }
  23. new EnumTest().judge(SeasonEnum.SPRING);
  24. }
  25. }

运行结果

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70

枚举类的成员变量、方法和构造器

实例变量

  1. Gender
  2. public enum Gender {
  3. MALE,FEMALE;
  4. //定义一个public修饰的实例变量
  5. public String name;
  6. }

GenderTest

  1. public class GenderTest {
  2. public static void main(String[] args) {
  3. Gender gender = Enum.valueOf(Gender.class, "FEMALE");
  4. gender.name="女";
  5. System.out.println(gender+"代表"+gender.name);
  6. }
  7. }

运行结果

20200405110536930.png

枚举类的实例只能是枚举值,而不是随意地通过new来创建枚举类对象。

Java应该把所以设计成良好封装的类,所以不应该允许直接访问Gender类的name成员变量,而是应该通过方法来控制对name的访问。否则可能出现很混乱的情形。

对上面代码进行改进

  1. Gender
  2. public enum Gender {
  3. MALE("男"),FEMALE("女");
  4. private final String name;
  5. Gender(String name){
  6. this.name = name;
  7. }
  8. public String getName(){
  9. return this.name;
  10. }
  11. }
  12. GenderTest
  13. public class GenderTest {
  14. public static void main(String[] args) {
  15. System.out.println(Gender.FEMALE.getName());
  16. }
  17. }

运行结果

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 1

实现接口的枚举类

枚举类也可以实现一个或多个接口。

代码举例说明

  1. GenderDesc
  2. public interface GenderDesc {
  3. void info();
  4. }
  5. Gender
  6. public enum Gender implements GenderDesc {
  7. MALE("男"){
  8. @Override
  9. public void info() {
  10. System.out.println("这个枚举值代表男性!");
  11. }
  12. },
  13. FENALW("女"){
  14. @Override
  15. public void info() {
  16. System.out.println("这个枚举值代表女性!");
  17. }
  18. };
  19. Gender(String name) {
  20. this.name = name;
  21. }
  22. private final String name;
  23. public String getName() {
  24. return name;
  25. }
  26. public static void main(String[] args) {
  27. Gender.FENALW.info();
  28. }
  29. }

运行结果

20200405114500666.png

包含抽象方法的枚举类

演示代码

  1. Operation
  2. public enum Operation {
  3. PLUS {
  4. @Override
  5. public double eval(double x, double y) {
  6. return x + y;
  7. }
  8. },
  9. MINUS {
  10. @Override
  11. public double eval(double x, double y) {
  12. return x - y;
  13. }
  14. },
  15. TIMES {
  16. @Override
  17. public double eval(double x, double y) {
  18. return x * y;
  19. }
  20. },
  21. DIVIDE {
  22. @Override
  23. public double eval(double x, double y) {
  24. return x / y;
  25. }
  26. };
  27. //抽象方法
  28. public abstract double eval(double x, double y);
  29. public static void main(String[] args) {
  30. System.out.println(Operation.PLUS.eval(3, 4));
  31. System.out.println(Operation.MINUS.eval(4, 1));
  32. System.out.println(Operation.TIMES.eval(3, 4));
  33. System.out.println(Operation.DIVIDE.eval(4, 2));
  34. }
  35. }

运行结果

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 2

说明:枚举类里定义抽象方法时不能使用abstract关键字将枚举类定义成抽象类(因为系统自动会为它添加abstract关键字),但因为枚举类需要显示创建枚举值,而不是作为父类,所以定义的每个枚举值时必须为抽象方法提供实现,否则出现编译错误。

发表评论

表情:
评论列表 (有 0 条评论,125人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java基础

    枚举 1、枚举是一种引用数据类型。 2、枚举编译之后也是class文件。 3、枚举类型怎么定义? enum 枚举类型名{ 枚举

    相关 java基础

    定义 在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象;再比如行星类,目前只有8个对象。这种实例有限而且固定的类,在Java里被称为枚举类。 Ja

    相关 Java基础--

    枚举类: JDK1.5以后新增了enum关键字,用来定义枚举类,枚举类是一种特殊的类, 它可以定义成员变量,方法,可以实现一个或者多个接口,也可以定义自己的构

    相关 java--

    枚举类 枚举类里面写的是对象,你也可以在下面写上成员方法或变量,这里面的对象可以调用这些方法,也可以说枚举类是用来存放固定个数的对象的。 > 格式: > > publ