项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.枚举类 (enum)

1.在某些情况下,一个类的对象时有限且固定的,如季节类,它只有春夏秋冬4个对象这种实例有限且固定的类,在 Java 中被称为枚举类;
2.在 Java 中使用 enum 关键字来定义枚举类,其地位与 class、interface 相同;
3.枚举类是一种特殊的类,它和普通的类一样,有自己的成员变量、成员方法、构造器 (只能使用 private 访问修饰符,所以无法从外部调用构造器,构造器只在构造枚举值时被调用);
4.一个 Java 源文件中最多只能有一个 public 类型的枚举类,且该 Java 源文件的名字也必须和该枚举类的类名相同,这点和类是相同的;
5.使用 enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Seriablizable 和 java.lang.Comparable 两个接口;
6.所有的枚举值都是 public static final 的,且非抽象的枚举类不能再派生子类;
7.枚举类的所有实例(枚举值)必须在枚举类的第一行显式地列出,否则这个枚举类将永远不能产生实例。列出这些实例(枚举值)时,系统会自动添加 public static final 修饰,无需程序员显式添加。

2.枚举类的使用

定义枚举类

// 定义一个星期的枚举类
public enum WeekEnum {// 在第一行显式地列出7个枚举实例(枚举值),系统会自动添加 public static final 修饰SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}

枚举类的成员变量、成员方法、构造器

package enumtest;public enum WeekEnum {// 因为已经定义了带参数的构造器,所以在列出枚举值时必须传入对应的参数SUNDAY("星期日"), MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY("星期三"), THURSDAY("星期四"), FRIDAY("星期五"), SATURDAY("星期六");// 定义一个 private 修饰的实例变量private String date;// 定义一个带参数的构造器,枚举类的构造器只能使用 private 修饰private WeekEnum(String date) {this.date = date;}// 定义 get set 方法public String getDate() {return date;}public void setDate(String date) {this.date = date;}}

枚举类中的常用方法

1.int compareTo(E o): 该方法用于与制定枚举对象比较顺序,同一个枚举实例只能与相同类型的枚举实例比较。如果该枚举对象位于指定枚举对象之后,则返回正整数;反之返回负整数;否则返回零;

public class Test01 {    public static void main(String[] args) {System.out.println(WeekEnum.FRIDAY.compareTo(WeekEnum.MONDAY));System.out.println(WeekEnum.FRIDAY.compareTo(WeekEnum.SUNDAY));System.out.println(WeekEnum.FRIDAY.compareTo(WeekEnum.SATURDAY));}
}

运行结果:
4
5
-1

2.String name(): 返回此枚举实例的名称,即枚举值 ;

3.static values(): 返回一个包含全部枚举值的数组,可以用来遍历所有枚举值;

// 没有重写 toString 方法
for (WeekEnum we : WeekEnum.values()) {System.out.println(we);}

运行结果:
SUNDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY

4.String toString(): 返回枚举值的名称,与 name 方法类似,更常用;

// 定义一个星期的枚举类
public enum WeekEnum {// 因为已经定义了带参数的构造器,所以在列出枚举值时必须传入对应的参数SUNDAY("星期日"), MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY("星期三"), THURSDAY("星期四"), FRIDAY("星期五"), SATURDAY("星期六");// 定义一个 private 修饰的实例变量private String date;// 定义一个带参数的构造器,枚举类的构造器只能使用 private 修饰private WeekEnum(String date) {this.date = date;}// 定义 get set 方法public String getDate() {return date;}public void setDate(String date) {this.date = date;}// 重写 toString() 方法@Overridepublic String toString(){return date;}
}
// 重写了 toString 方法
for (WeekEnum we : WeekEnum.values()) {System.out.println(we);}

运行结果:
星期日
星期一
星期二
星期三
星期四
星期五
星期六

结合上面3.4点,可以看到,重写 toString 方法前后所返回的枚举值不同!

5.int ordinal(): 返回枚举值在枚举类中的索引值(从0开始),即枚举值在枚举声明中的顺序,这个顺序根据枚举值声明的顺序而定;

System.out.println(WeekEnum.SUNDAY.ordinal());
System.out.println(WeekEnum.FRIDAY.ordinal());

运行结果:
0
5

6.static valueOf(): 返回带指定名称的指定枚举类型的枚举常量,名称必须与在此类型中声明枚举常量所用的标识符完全匹配(不允许使用额外的空白字符)。这个方法与toString相对应,因此重写 toString() 方法,一定要重写 valueOf() 方法(我们可以重写 toString() 方法,但不能自己重写 valueOf() 方法,当我们重写 toString() 方法时,valueOf() 方法会自动重写,不用我们理会。);

public class Test01 {public static void main(String[] args) {System.out.println(WeekEnum.valueOf(WeekEnum.class, "MONDAY"));System.out.println(WeekEnum.valueOf(WeekEnum.class, "FRIDAY"));System.out.println(WeekEnum.valueOf(WeekEnum.class, "SUNDAY"));}
}

运行结果:
MONDAY
FRIDAY
SUNDAY

7.boolean equals()方法: 比较两个枚举类对象的引用。

使用枚举类实现接口
与普通类一样,枚举类也可以实现一个或多个接口。枚举类实现接口时,同样要实现
该接口的所有方法。

public interface GenderDescription {public void info();}

上面定义了一个接口,该接口有一个 info() 方法,凡是实现该接口的类都需要实现该方法。

public enum Gender implements GenderDescription {MALE,FEMALE;@Overridepublic void info() {System.out.println("这是一个用于定义性别的枚举类");}}
public class Test02 {public static void main(String[] args) {Gender.MALE.info();Gender.FEMALE.info();}}

运行结果:
这是一个用于定义性别的枚举类
这是一个用于定义性别的枚举类

3.包含抽象方法的枚举类

定义一个 Operation 枚举类,有4个枚举值PLUS、MINUS、TIMES、DIVIDE,分别代表加、减、乘、除,该枚举类有一个 calculate() 方法,用于完成计算。

public enum Operation {// 用于执行加法运算PLUS { // 花括号部分其实是一个匿名内部子类@Overridepublic double calculate(double x, double y) {return x + y;}},// 用于执行减法运算MINUS { // 花括号部分其实是一个匿名内部子类@Overridepublic double calculate(double x, double y) {// TODO Auto-generated method stubreturn x - y;}},// 用于执行乘法运算TIMES { // 花括号部分其实是一个匿名内部子类@Overridepublic double calculate(double x, double y) {return x * y;}},// 用于执行除法运算DIVIDE { // 花括号部分其实是一个匿名内部子类@Overridepublic double calculate(double x, double y) {return x / y;}};//为该枚举类定义一个抽象方法,枚举类中所有的枚举值都必须实现这个方法public abstract double calculate(double x, double y);}
public class Test03 {public static void main(String[] args) {System.out.println("6 + 2 = " + Operation.PLUS.calculate(6, 3));System.out.println("6 - 2 = " + Operation.MINUS.calculate(6, 2));System.out.println("6 * 2 = " + Operation.TIMES.calculate(6, 2));System.out.println("6 / 2 = " + Operation.DIVIDE.calculate(6, 2));}}

运行结果:

原文链接地址:
http://www.jianshu.com/p/46dbd930f6a2

Java 中的枚举 (enum)相关推荐

  1. java中的枚举_Java中的枚举

    java中的枚举 Enum was introduced in Java 1.5 as a new type whose fields consists of a fixed set of const ...

  2. java中的枚举是什么?枚举怎么使用?

    关于java枚举的文章早已是非常多了,本文是对我个人过往学习java,理解及应用java枚举的一个总结.此文内容涉及java枚举的基本概念,以及java中的枚举是什么?枚举怎么使用?希望对大家有所帮助 ...

  3. Java中的枚举,竟然有这么多不为人知的知识点

    Java枚举,也称作Java枚举类型,是一种字段由一组固定常量集合组成的类型.枚举的主要目的是加强编译时类型的安全性.enum关键字是Java中的保留关键字. 在编译或设计时,当我们知道所有变量的可能 ...

  4. java中的枚举类与注解学习笔记

    java中的枚举和注解 01.枚举类的使用 1.1.枚举类的理解 1.2.自定义枚举类 1.3.使用enum关键字定义枚举类 1.4.Enum类中的常用方法 1.5.使用enum关键字定义的枚举类实现 ...

  5. 诚之和:Java基础知识枚举Enum类介绍以及案例使用详解

    Java语言中的数据类型可以分为两大类,分别是基本数据类型和引用数据类型.本篇文章要介绍的枚举,就是属于Java的引用数据类型.下面,将为大家详细介绍Java中的枚举,以及具体的使用案例. 一.文章序 ...

  6. C++中的枚举(enum)

    C++中的枚举(enum) 枚举类型(enumeration)是 C++ 中的一种派生数据类型,它是由用户定义的若干枚举常量的集合. 枚举是一个数值集合,是给一个值命名的一种方法. 如果想要使用整数来 ...

  7. 用好 Java 中的枚举,让你的工作效率飞起来!

    1.概览 在本文中,我们将看到什么是 Java 枚举,它们解决了哪些问题以及如何在实践中使用 Java 枚举实现一些设计模式. enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承j ...

  8. JAVA中的枚举小结

    枚举 将一组有限集合创建为一种新的类型,集合里面的值可以作为程序组件使用: 枚举基本特性 以下代码是枚举的简单使用: 使用values方法返回enum实例的数组 使用ordinal方法返回每个enum ...

  9. 用好 Java 中的枚举,真的没有那么简单!

    1.概览 在本文中,我们将看到什么是 Java 枚举,它们解决了哪些问题以及如何在实践中使用  Java 枚举实现一些设计模式. enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承 ...

  10. java中的枚举类_java中的枚举类型

    java中为了对参数类型使用限定,引入了泛型,实现了在编译期对参数类型是否合法的判断.同样,java为了对参数的值的限定,引入了枚举类,实现了在编译期对参数的值是否合法的判断. 首先我们用自定义类的方 ...

最新文章

  1. mysql字符串外键约束_MySQL中的约束函数主外键
  2. R语言t分布函数Student t distribution(dt, pt, qt rt )实战
  3. 谷歌大脑2017总结下篇:从医疗、机器人等6个领域开始的改变世界之旅
  4. C++跨类调用——extern
  5. 【矩阵乘法】OpenJ_POJ - C17F - A Simple Math Problem
  6. [转载] Java序列化的几种方式以及序列化的作用
  7. PL/SQL Developer将Excel表格数据导入表格
  8. Sql 语句:显示 Sql Server 中所有表中的信息
  9. 步骤1:mybatis工程的创建
  10. javascript删除数组某个元素
  11. mysql isamchk_mysqlcheck与myisamchk的区别
  12. 分享一个强大的4K/8K超高清视频下载器
  13. 1028 人口普查 (Python实现)
  14. 百度网盘更新,不限速了?
  15. 使用vscode,根据vue基础模板文件生成代码
  16. 信奥赛1990:【19CSPS提高组】划分 解题报告(附ac主代码)
  17. 2022智源大会议程公开 | 预训练大模型论坛
  18. 计算机会计学试题,会计电算化考试试题 (2010)
  19. js中excel模板下载
  20. 如何彻底删除打印机驱动程序

热门文章

  1. win10下安装maven
  2. Python爬虫从入门到放弃(二十四)之 Scrapy登录知乎
  3. “一夜成名”需要多久?他花了20年!
  4. Google Go TCP 开发
  5. 少量数据通过Excel表格数据导入server SqlServer查询
  6. 搭建证书服务器(2003)学习笔记
  7. MySQL 主外键关系
  8. 2018-08-31 基于CSS3D视角,实现视差滚动
  9. 八叶一刀流·三之型·业炎击团队
  10. 又拍云引领云CDN加速 或成互联网刚性需求