Java教程

Java 枚举类

本文主要是介绍Java 枚举类,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

参考:https://www.bilibili.com/video/BV1Kb411W75N

0x01 枚举类是什么

枚举类是一种类,它的特点是对象数量有限且确定(对象是写死的)。

当我们需要定义一组常量时(例如四季、周一到周日、12个月等),一般会使用枚举类。

0x02 如何定义枚举类

在jdk5.0之后,提供了enum关键字来定义枚举类,用enum关键字定义的枚举类默认继承于 java.lang.Enum 类

// 使用enum关键字定义枚举类
enum Season1 {
    // 1. 提供当前枚举类的对象,多个对象之间用“,”隔开,末尾对象用“;”结束
    SPRING("春天", "春暖花开"),
    SUMMER("夏天", "夏日炎炎"),
    AUTUMN("秋天", "秋高气爽"),
    WINTER("冬天", "冰天雪地");

    // 2. 声明Season对象的属性:用 private final 修饰
    private final String seasonName;
    private final String seasonDesc;

    // 3. 私有化类的构造器,并给对象属性赋值
    private Season1(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
    
    // 4. 其它诉求:获取枚举类对象的属性
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }
}

0x03 Enum类中的常用方法

Enum类中的常用方法有3个:

  • values(): 返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
  • valueOf(String str): 可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常:IllegalArgumentException。
  • toString(): 返回当前枚举类对象常量的名称。
/**
 * 使用enum关键字定义枚举类
 * 说明:定义的枚举类默认继承于 java.lang.Enum 类
 */
public class SeasonTest1 {
    public static void main(String[] args) {
        Season1 summer = Season1.SUMMER;
        // toString():
        System.out.println(summer.toString());
        System.out.println("********************************");
        // values():
        Season1[] values = Season1.values();
        for (int i = 0; i < values.length; i++) {
            System.out.println(values[i]);
        }

        // valueOf(String ovjName): 返回枚举类中对象名是objName的对象。
        // 如果没有objName的枚举类对象,则抛异常:IllegalArgumentException
        Season1 winter = Season1.valueOf("WINTER");
//        Season1 winter = Season1.valueOf("WINTER1");
        System.out.println(winter);
    }
}

// 使用enum关键字定义枚举类
enum Season1 {
    // 1. 提供当前枚举类的对象,多个对象之间用“,”隔开,末尾对象用“;”结束
    SPRING("春天", "春暖花开"),
    SUMMER("夏天", "夏日炎炎"),
    AUTUMN("秋天", "秋高气爽"),
    WINTER("冬天", "冰天雪地");

    // 2. 声明Season对象的属性:用 private final 修饰
    private final String seasonName;
    private final String seasonDesc;

    // 3. 私有化类的构造器,并给对象属性赋值
    private Season1(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
    
    // 4. 其它诉求:获取枚举类对象的属性
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }
}

0x04 使用枚举类来实现接口

1、直接在enum类中重写接口中声明的抽象方法,这也是实现接口最惯用的方法,但有个问题是这样实现接口的话,枚举类中的不同对象调用的是同一个方法,调用的结果也都是相同的,如果我想让每个对象调用不同的方法,获得不同的结果,应该怎么办呢?

2、让枚举类中的每个对象分别实现接口中的抽象方法。

/**
 * 使用enum关键字定义枚举类
 * 说明:定义的枚举类默认继承于 java.lang.Enum 类
 */
public class SeasonTest1 {
    public static void main(String[] args) {
        Season1 summer = Season1.SUMMER;
        // 遍历Season1枚举类中每个对象的show方法
        Season1[] values = Season1.values();
        for (int i = 0; i < values.length; i++) {
            System.out.println(values[i]);
            values[i].show();
        }
        
        // 调用WINTER的show方法
        winter.show();
    }
}

interface Info {
    void show();
}

// 使用enum关键字定义枚举类
enum Season1 implements Info{
    // 1. 提供当前枚举类的对象,多个对象之间用“,”隔开,末尾对象用“;”结束
    SPRING("春天", "春暖花开") {
        @Override
        public void show() {
            System.out.println("春天在哪里");
        }
    },
    SUMMER("夏天", "夏日炎炎") {
        @Override
        public void show() {
            System.out.println("宁夏");
        }
    },
    AUTUMN("秋天", "秋高气爽") {
        @Override
        public void show() {
            System.out.println("秋天不回来");
        }
    },
    WINTER("冬天", "冰天雪地") {
        @Override
        public void show() {
            System.out.println("大约在冬季");
        }
    };

    // 2. 声明Season对象的属性:用 private final 修饰
    private final String seasonName;
    private final String seasonDesc;

    // 3. 私有化类的构造器,并给对象属性赋值
    private Season1(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    // 4. 其它诉求:获取枚举类对象的属性
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }
}

这篇关于Java 枚举类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!