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是比较对象内容是否相同


相关文章
|
5天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
31 3
|
1天前
|
人工智能 安全 Java
Java8 - LocalDateTime时间日期类使用详解
Java8 - LocalDateTime时间日期类使用详解
|
2天前
|
安全 Java 程序员
|
3天前
|
Java
Java Class类
Java Class类
8 0
|
9天前
|
Java 编译器
Java Character 类
4月更文挑战第13天
|
10天前
|
存储 Java
Java基础教程(7)-Java中的面向对象和类
【4月更文挑战第7天】Java是面向对象编程(OOP)语言,强调将事务抽象成对象。面向对象与面向过程的区别在于,前者通过对象间的交互解决问题,后者按步骤顺序执行。类是对象的模板,对象是类的实例。创建类使用`class`关键字,对象通过`new`运算符动态分配内存。方法包括构造函数和一般方法,构造函数用于对象初始化,一般方法处理逻辑。方法可以有0个或多个参数,可变参数用`类型...`定义。`this`关键字用于访问当前对象的属性。
|
14天前
|
Java Shell
Java 21颠覆传统:未命名类与实例Main方法的编码变革
Java 21颠覆传统:未命名类与实例Main方法的编码变革
13 0
|
14天前
|
Java
Java 15 神秘登场:隐藏类解析未知领域
Java 15 神秘登场:隐藏类解析未知领域
17 0
|
16天前
|
安全 Java
append在Java中是哪个类下的方法
append在Java中是哪个类下的方法
23 9
|
16天前
|
Java API
Java基础—笔记—内部类、枚举、泛型篇
本文介绍了Java编程中的内部类、枚举和泛型概念。匿名内部类用于简化类的创建,常作为方法参数,其原理是生成一个隐含的子类。枚举用于表示有限的固定数量的值,常用于系统配置或switch语句中。泛型则用来在编译时增强类型安全性,接收特定数据类型,包括泛型类、泛型接口和泛型方法。
9 0