Java中的枚举类

简介: 笔记

Java中是使用enum关键词声明枚举类,具体定义放在一对大括号内,枚 举的语法格式如下:

[public] enum 枚举名 { 
  枚举常量列表 
}

enum前面的修饰符是[public]表示public或省略。public是公有访问级别,可以在任何地方访问。省略是 默认访问级别,只能在当前包中访问。


最简单形式的枚举


public enum WeekDays { 
  // 枚举常量列表 
  MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY 
}

在枚举类WeekDays中定义了5个常量,使用枚举类WeekDays代码如下:

class HelloWorld{
    public static void main(String[] args) {
        // day工作日变量
        WeekDays day = WeekDays.FRIDAY;
        System.out.println(days);
        switch (day){
            case MONDAY:
                System.out.println("周一");
                break;
            case TUESDAY:
                System.out.println("星期二");
                break;
            case WEDNESDAY:
                System.out.println("星期三");
                break;
            case THURSDAY:
                System.out.println("星期四");
                break;
            default: //case FRIDAY:
                System.out.println("星期五");
      }
  }   
}

输出结果:

FRIDAY 
星期五


枚举类中成员变量和成员方法


枚举类可以像类一样包含成员变量和成员方法,成员变量可以是实例变量也可以是静态变量,成员方 法可以是实例方法,也可以是静态方法,但不能是抽象方法。

public enum WeekDays {
    // 枚举常量列表
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;
//    实例变量
    private String name;
    private int index;
//    静态变量
    private static int staticVar = 80;
    // 覆盖父类中的toString()方法
    @Override
    public String toString(){
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(name);
        stringBuilder.append("-");
        stringBuilder.append(index);
        return stringBuilder.toString();
    }
//    实例方法
    public String getString(){
//        调用父类String中的toString方法
        return super.toString();
    }
//    静态方法
    public static int getStaticVar(){
        return staticVar;
    }
}

使用枚举类WeekDays代码如下:

public class HelloWorld {
  public static void main(String[] args) { 
    // day工作日变量 
    WeekDays day = WeekDays.FRIDAY;
    //打印day默认调用枚举toString()方法 
    System.out.println(day); 
    //调用枚举实例方法 
    System.out.println(day.getInfo()); 
    //调用枚举静态方法 
    System.out.println(WeekDays.getStaticVar());
  }
}


枚举类构造方法


上面示例中实例变量name和index,都是没有初始化,在类中成员变量的初始化是通过构造方法 实现的,而在枚举类中也是通过构造方法初始化成员变量的。

添加构造方法,代码如下:

public enum WeekDays {
    // 枚举常量列表
    MONDAY("周一",0), TUESDAY("周二",1), WEDNESDAY("周三",2), THURSDAY("周四",3), FRIDAY("周五",4);
//    实例变量
    private String name;
    private int index;
//    静态变量
    private static int staticVar = 80;
//    构造方法
    private WeekDays(String name,int index){
        this.name = name;
        this.index = index;
    }
    // 覆盖父类中的toString()方法
    @Override
    public String toString(){
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(name);
        stringBuilder.append("-");
        stringBuilder.append(index);
        return stringBuilder.toString();
    }
//    实例方法
    public String getString(){
//        调用父类String中的toString方法
        return super.toString();
    }
//    静态方法
    public static int getStaticVar(){
        return staticVar;
    }
}

注意枚举类的中的构造方法只能是私有访问级别,构造方法可以 省略private关键字,但它仍然是私有的构造方法。这也说明了枚举类不允许在外部创建对象。


一旦添加了有参数的构造方法,那么“枚举常量列表”也需要修改,每一个枚举常量都 是一个实例,都会调用构造方法进行初始化成员变量,(“星期一”, 0)是调用构造方法。


枚举常用方法


所有枚举类都继承java.lang.Enum类,Enum中定义了一些枚举中常用的方法:


int ordinal():返回枚举常量的顺序。这个顺序根据枚举常量声明的顺序而定,顺序从零开始。

枚举类型[] values():静态方法,返回一个包含全部枚举常量的数组。

枚举类型 valueOf(String str):静态方法,str是枚举常量对应的字符串,返回一个包含枚举类型 实例。

见完整代码

//枚举类
public enum WeekDays {
    // 枚举常量列表
    MONDAY("周一",0), TUESDAY("周二",1), WEDNESDAY("周三",2), THURSDAY("周四",3), FRIDAY("周五",4);
//    实例变量
    private String name;
    private int index;
//    静态变量
    private static int staticVar = 80;
//    构造方法
    private WeekDays(String name,int index){
        this.name = name;
        this.index = index;
    }
    // 覆盖父类中的toString()方法
    @Override
    public String toString(){
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(name);
        stringBuilder.append("-");
        stringBuilder.append(index);
        return stringBuilder.toString();
    }
//    实例方法
    public String getString(){
//        调用父类String中的toString方法
        return super.toString();
    }
//    静态方法
    public static int getStaticVar(){
        return staticVar;
    }
}
class HelloWorld{
    public static void main(String[] args) {
        // day工作日变量
        WeekDays days = WeekDays.FRIDAY;
        System.out.println(days);
        switch (days){
            case MONDAY:
                System.out.println("周一");
                break;
            case TUESDAY:
                System.out.println("星期二");
                break;
            case WEDNESDAY:
                System.out.println("星期三");
                break;
            case THURSDAY:
                System.out.println("星期四");
                break;
            default: //case FRIDAY:
                System.out.println("星期五");
            }
            System.out.println(days.getString());
            System.out.println(WeekDays.getStaticVar());
//            返回一个包含全部枚举常量的数组
        WeekDays[] allvalues = WeekDays.values();
//        遍历枚举常量数值
        for (WeekDays value:allvalues){
            System.out.printf("%d - %s\n",value.ordinal(),value);
        }
//        创建Weekdays对象
        WeekDays days1 = WeekDays.FRIDAY;
        WeekDays days2 = WeekDays.valueOf("FRIDAY");
        System.out.println(days1 == WeekDays.FRIDAY);
        System.out.println(days1.equals(WeekDays.FRIDAY));
        System.out.println(days1 == days2);
    }
}

运行结果:

周五-4
星期五
FRIDAY
80
0 - 周一-0
1 - 周二-1
2 - 周三-2
3 - 周四-3
4 - 周五-4
true
true
true

这里又会涉及到两种比较方法==和equals。

  • ==比较的是两个引用是否指 向同一个对象
  • equals是比较对象内容是否相同


相关文章
|
6月前
|
Java 编译器 API
Java 密封类:精细化控制继承关系
Java 密封类:精细化控制继承关系
388 83
|
4月前
|
安全 Java 数据建模
Java记录类:简化数据载体的新选择
Java记录类:简化数据载体的新选择
270 101
|
4月前
|
安全 Java 开发者
Java记录类:简化数据载体的新方式
Java记录类:简化数据载体的新方式
307 100
|
7月前
|
IDE Java 数据挖掘
Java 基础类从入门到精通实操指南
这份指南专注于**Java 17+**的新特性和基础类库的现代化用法,涵盖开发环境配置、数据类型增强(如文本块)、字符串与集合处理进阶、异常改进(如密封类)、IO操作及实战案例。通过具体代码示例,如CSV数据分析工具,帮助开发者掌握高效编程技巧。同时提供性能优化建议和常用第三方库推荐,适合从入门到精通的Java学习者。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
258 36
|
5月前
|
安全 IDE Java
Java记录类型(Record):简化数据载体类
Java记录类型(Record):简化数据载体类
452 143
|
3月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
131 4
|
3月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
216 5
|
3月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
202 1
|
3月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
261 1
|
3月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
209 2