Java 中的枚举 (enum)
项目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)相关推荐
- java中的枚举_Java中的枚举
java中的枚举 Enum was introduced in Java 1.5 as a new type whose fields consists of a fixed set of const ...
- java中的枚举是什么?枚举怎么使用?
关于java枚举的文章早已是非常多了,本文是对我个人过往学习java,理解及应用java枚举的一个总结.此文内容涉及java枚举的基本概念,以及java中的枚举是什么?枚举怎么使用?希望对大家有所帮助 ...
- Java中的枚举,竟然有这么多不为人知的知识点
Java枚举,也称作Java枚举类型,是一种字段由一组固定常量集合组成的类型.枚举的主要目的是加强编译时类型的安全性.enum关键字是Java中的保留关键字. 在编译或设计时,当我们知道所有变量的可能 ...
- java中的枚举类与注解学习笔记
java中的枚举和注解 01.枚举类的使用 1.1.枚举类的理解 1.2.自定义枚举类 1.3.使用enum关键字定义枚举类 1.4.Enum类中的常用方法 1.5.使用enum关键字定义的枚举类实现 ...
- 诚之和:Java基础知识枚举Enum类介绍以及案例使用详解
Java语言中的数据类型可以分为两大类,分别是基本数据类型和引用数据类型.本篇文章要介绍的枚举,就是属于Java的引用数据类型.下面,将为大家详细介绍Java中的枚举,以及具体的使用案例. 一.文章序 ...
- C++中的枚举(enum)
C++中的枚举(enum) 枚举类型(enumeration)是 C++ 中的一种派生数据类型,它是由用户定义的若干枚举常量的集合. 枚举是一个数值集合,是给一个值命名的一种方法. 如果想要使用整数来 ...
- 用好 Java 中的枚举,让你的工作效率飞起来!
1.概览 在本文中,我们将看到什么是 Java 枚举,它们解决了哪些问题以及如何在实践中使用 Java 枚举实现一些设计模式. enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承j ...
- JAVA中的枚举小结
枚举 将一组有限集合创建为一种新的类型,集合里面的值可以作为程序组件使用: 枚举基本特性 以下代码是枚举的简单使用: 使用values方法返回enum实例的数组 使用ordinal方法返回每个enum ...
- 用好 Java 中的枚举,真的没有那么简单!
1.概览 在本文中,我们将看到什么是 Java 枚举,它们解决了哪些问题以及如何在实践中使用 Java 枚举实现一些设计模式. enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承 ...
- java中的枚举类_java中的枚举类型
java中为了对参数类型使用限定,引入了泛型,实现了在编译期对参数类型是否合法的判断.同样,java为了对参数的值的限定,引入了枚举类,实现了在编译期对参数的值是否合法的判断. 首先我们用自定义类的方 ...
最新文章
- mysql字符串外键约束_MySQL中的约束函数主外键
- R语言t分布函数Student t distribution(dt, pt, qt rt )实战
- 谷歌大脑2017总结下篇:从医疗、机器人等6个领域开始的改变世界之旅
- C++跨类调用——extern
- 【矩阵乘法】OpenJ_POJ - C17F - A Simple Math Problem
- [转载] Java序列化的几种方式以及序列化的作用
- PL/SQL Developer将Excel表格数据导入表格
- Sql 语句:显示 Sql Server 中所有表中的信息
- 步骤1:mybatis工程的创建
- javascript删除数组某个元素
- mysql isamchk_mysqlcheck与myisamchk的区别
- 分享一个强大的4K/8K超高清视频下载器
- 1028 人口普查 (Python实现)
- 百度网盘更新,不限速了?
- 使用vscode,根据vue基础模板文件生成代码
- 信奥赛1990:【19CSPS提高组】划分 解题报告(附ac主代码)
- 2022智源大会议程公开 | 预训练大模型论坛
- 计算机会计学试题,会计电算化考试试题 (2010)
- js中excel模板下载
- 如何彻底删除打印机驱动程序