Java枚举类(1)--枚举类的定义、方法使用和接口实现

简介: Java枚举类(1)--枚举类的定义、方法使用和接口实现

文章目录


枚举类的理解

枚举类的定义

Enum类的主要方法

枚举类实现接口


枚举类的理解


当类的对象只有有限个,且确定的,称此类为枚举类。


当需要定义一组常量时,强烈建议使用枚举类。


如果枚举类中只有一个对象,则可以作为单例模式的实现方式。


枚举类的定义


方式一:jdk5.0之前, 自定义枚举类

方式二:jdk5.0, 可以使用enum关键字定义枚举类


①自定义枚举类


class Season{
    //1.声明属性:private,final修饰,私有性,不可变性
    private final String SEASON_NAME;//季节的名称
    private final String SEASON_DESC;//季节的描述
    //2.提供私有化构造器,并给属性赋值
    private Season(String seasonName,String seasonDesc){
        this.SEASON_NAME = seasonName;
        this.SEASON_DESC = seasonDesc;
    }
    //3.提供当前枚举类的多个对象:public,static,final
    public static final Season SPRING = new Season("春天", "春暖花开");
    public static final Season SUMMER = new Season("夏天", "夏日炎炎");
    public static final Season AUTUMN = new Season("秋天", "秋高气爽");
    public static final Season WINTER = new Season("冬天", "白雪皑皑");
    //4.其他诉求1:获取对象属性
    public String getSEASON_NAME() {
        return SEASON_NAME;
    }
    public String getSEASON_DESC() {
        return SEASON_DESC;
    }
    //4.其他诉求2
    @Override
    public String toString() {
        return "Season{" +
                "SEASON_NAME='" + SEASON_NAME + '\'' +
                ", SEASON_DESC='" + SEASON_DESC + '\'' +
                '}';
    }
}
//使用测试
public class EnumTest {
    public static void main(String[] args) {
        Season autumn = Season.AUTUMN;
        System.out.println(autumn);
    }
}


27e56552c58b43b8bea271a635f278da.png


②使用enum关键字定义枚举类


使用说明:


1.使用 enum 定义的枚举类默认继承了 java.lang.Enum类,因此不能再继承其他类

2.枚举类的构造器只能使用 private 权限修饰符

3.枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾),列出的实例系统会自动添加 public static final 修饰

4.必须在枚举类的最开始声明枚举类对象


JDK 1.5 中可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字, 无需添加枚举类作为限定。


//enum关键字
enum Season{
    //1.提供当前枚举类的多个对象,对象之间用","隔开,最后用";"
    SPRING("春天", "春暖花开"),
    SUMMER("夏天", "夏日炎炎"),
    AUTUMN("秋天", "秋高气爽"),
    WINTER("冬天", "白雪皑皑");
    //2.声明属性:private,final修饰,私有性,不可变性
    private final String SEASON_NAME;//季节的名称
    private final String SEASON_DESC;//季节的描述
    //3.提供私有化构造器,并给属性赋值
    private Season(String seasonName,String seasonDesc){
        this.SEASON_NAME = seasonName;
        this.SEASON_DESC = seasonDesc;
    }
    //4.其他诉求1:获取对象属性
    public String getSEASON_NAME() {
        return SEASON_NAME;
    }
    public String getSEASON_DESC() {
        return SEASON_DESC;
    }
}
//使用测试
public class EnumTest {
    public static void main(String[] args) {
        Season autumn = Season.AUTUMN;
        System.out.println(autumn);
    }
}


Enum类的主要方法



83076240d7ff409cab37711c3dcd49ed.png


常用方法:

①values():返回枚举类型的对象数组。该方法可以很方便地遍历所有枚举值

②valueOf(String objName):找到枚举类中名为objName的对象,如果没有名为objName的枚举类对象,则抛异常: ILLegaLArgumentException

③toString():返回当前枚举类对象常量的名称,若其子类(enum关键字定义的枚举类对象调用该方法时候,若没有重写,则调用此方法)


enum Season{
    //1.提供当前枚举类的多个对象,对象之间用","隔开,最后用";"
    SPRING("春天", "春暖花开"),
    SUMMER("夏天", "夏日炎炎"),
    AUTUMN("秋天", "秋高气爽"),
    WINTER("冬天", "白雪皑皑");
    //2.声明属性:private,final修饰,私有性,不可变性
    private final String SEASON_NAME;//季节的名称
    private final String SEASON_DESC;//季节的描述
    //3.提供私有化构造器,并给属性赋值
    private Season(String seasonName,String seasonDesc){
        this.SEASON_NAME = seasonName;
        this.SEASON_DESC = seasonDesc;
    }
}
//方法使用测试
public class EnumTest {
    public static void main(String[] args) {
        //toString()
        Season autumn = Season.AUTUMN;
        System.out.println(autumn);
        System.out.println("***********");
        //values()
        Season[] values = Season.values();
        for (int i = 0; i < values.length; i++) {
            System.out.println(values[i]);
        }
        System.out.println("***********");
        //valueOf(String str)
        Season winter = Season.valueOf("WINTER");
        System.out.println(winter);
    }
}


枚举类实现接口


和普通 Java 类一样,枚举类可以实现一个或多个接口。


若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。


若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式,则可以让每个枚举值分别来实现该方法。


interface itf{
    void show();
}
enum Season implements itf{
    //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.声明属性:private,final修饰,私有性,不可变性
    private final String SEASON_NAME;//季节的名称
    private final String SEASON_DESC;//季节的描述
    //3.提供私有化构造器,并给属性赋值
    private Season(String seasonName,String seasonDesc){
        this.SEASON_NAME = seasonName;
        this.SEASON_DESC = seasonDesc;
    }
}


相关文章
|
3天前
|
存储 安全 算法
Java容器及其常用方法汇总
Java Collections框架提供了丰富的接口和实现类,用于管理和操作集合数据。
Java容器及其常用方法汇总
|
5天前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
21 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
3天前
|
Java API
java.time常用方法汇总
`java.time` API 是从 Java 8 开始引入的时间日期处理库,旨在替代老旧的 `java.util.Date` 和 `Calendar`。它提供了更简洁、强大和灵活的方式处理日期、时间、时区及时间间隔,支持全球化和时间计算需求。API 包含获取当前时间、创建指定时间、解析和格式化字符串、进行加减运算、比较时间、获取年月日时分秒、计算时间间隔、时区转换以及判断闰年等功能。示例代码展示了如何使用这些功能,极大简化了开发中的时间处理任务。
|
6天前
|
安全 Java 编译器
JAVA泛型类的使用(二)
接上一篇继续介绍Java泛型的高级特性。3. **编译时类型检查**:尽管运行时发生类型擦除,编译器会在编译阶段进行严格类型检查,并允许通过`extends`关键字对类型参数进行约束,确保类型安全。4. **桥方法**:为保证多态性,编译器会生成桥方法以处理类型擦除带来的问题。5. **运行时获取泛型信息**:虽然泛型信息在运行时被擦除,但可通过反射机制部分恢复这些信息,例如使用`ParameterizedType`来获取泛型参数的实际类型。
|
6天前
|
安全 Java 编译器
JAVA泛型类的使用(一)
Java 泛型类是 JDK 5.0 引入的重要特性,提供编译时类型安全检测,增强代码可读性和可维护性。通过定义泛型类如 `Box&lt;T&gt;`,允许使用类型参数。其核心原理是类型擦除,即编译时将泛型类型替换为边界类型(通常是 Object),确保与旧版本兼容并优化性能。例如,`Box&lt;T&gt;` 编译后变为 `Box&lt;Object&gt;`,从而实现无缝交互和减少内存开销。
|
26天前
|
Java
Java快速入门之类、对象、方法
本文简要介绍了Java快速入门中的类、对象和方法。首先,解释了类和对象的概念,类是对象的抽象,对象是类的具体实例。接着,阐述了类的定义和组成,包括属性和行为,并展示了如何创建和使用对象。然后,讨论了成员变量与局部变量的区别,强调了封装的重要性,通过`private`关键字隐藏数据并提供`get/set`方法访问。最后,介绍了构造方法的定义和重载,以及标准类的制作规范,帮助初学者理解如何构建完整的Java类。
|
22天前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
55 9
|
28天前
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
60 12
|
29天前
|
算法 Java API
Java 方法注释:规范、实用和高质量的写法
本文深入探讨了如何编写高质量的 Java 方法注释
50 11
|
Java
JAVA方法的定义
JAVA方法的定义
117 0