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


相关文章
|
1月前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
41 6
|
27天前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
104 60
|
5天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
|
23天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
43 17
|
14天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
18天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
67 4
|
19天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
41 2
|
23天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
27天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
27天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
下一篇
无影云桌面