项目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. AndroidStudio脚本命令指定AAR生成目录与版本号
  2. ESP32­-PICO-­D4的使用
  3. 《进化——我们在互联网上奋斗的故事》一一1.1 靠谱工程师向管理者的转变...
  4. SAP CRM呼叫中心end按钮的实现逻辑
  5. Java EE CDI依赖注入(@Inject)教程
  6. Linux系统配置及服务管理_第03章用户管理
  7. Python3中的魔术方法汇总
  8. Android日志系统Logcat源代码简要分析
  9. pycharm调节字体大小
  10. 小白学前端之:JavaScript null 和 undefined 的区别
  11. 用Excel表格神速写代码
  12. Remote Desktop Connection Manager (RDCMan) 介绍
  13. 【算法基础三】算法如何入门?零基础入门算法应该学些什么?
  14. 自抗扰控制matlab仿真,自抗扰控制器的simulink建模与仿真.pdf
  15. linux一键安装aria2,Centos7下安装Aria2教程 之 Aria2 一键安装管理脚本
  16. 网课答案公众号搭建过程详解
  17. 基于PTPX的功耗分析
  18. 华为手机热点无法连接_华为手机热点连不上
  19. android厨房的使用方法,懒人生活的福音:Android在厨房_软件资讯技巧应用-中关村在线...
  20. [深度学习] - 网络模型训练过程的 loss 变化分析 (loss / val_loss / test_loss)

热门文章

  1. 基于Vue.js 2.x系列 + Element UI + RBAC/AUTH权限 的响应式后台管理系统
  2. 20171001~08总结
  3. web CSS的知识- 关于后代选择器,子选择器,兄弟选择器的使用
  4. Redis基础知识 之——发布/订阅
  5. mabatis的工作原理
  6. 2015年8月27日--培训作业是几个练习题
  7. .net知识和学习方法系列(二十三)嵌套类
  8. HTTP1.0/1.1/2.0特性对比_转
  9. 深入理解JavaScript系列(25):设计模式之单例模式
  10. 半自动化运维之服务器信息维护