枚举类 (enum)

在某些情况下,一个类的对象时有限且固定的,如季节类,它只有春夏秋冬4个对象这种实例有限且固定的类,在 Java 中被称为枚举类;

在 Java 中使用 enum 关键字来定义枚举类,其地位与 class、interface 相同;

枚举类是一种特殊的类,它和普通的类一样,有自己的成员变量、成员方法、构造器 (只能使用 private 访问修饰符,所以无法从外部调用构造器,构造器只在构造枚举值时被调用);

一个 Java 源文件中最多只能有一个 public 类型的枚举类,且该 Java 源文件的名字也必须和该枚举类的类名相同,这点和类是相同的;

使用 enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Seriablizable 和 java.lang.Comparable 两个接口;

所有的枚举值都是 public static final 的,且非抽象的枚举类不能再派生子类;

枚举类的所有实例(枚举值)必须在枚举类的第一行显式地列出,否则这个枚举类将永远不能产生实例。列出这些实例(枚举值)时,系统会自动添加 public static final 修饰,无需程序员显式添加。

枚举类的使用

定义枚举类

// 定义一个星期的枚举类

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;

}

}

枚举类中的常用方法

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));

}

}

运行结果:

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

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

// 没有重写 toString 方法

for (WeekEnum we : WeekEnum.values()) {

System.out.println(we);

}

运行结果:

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() 方法

@Override

public String toString(){

return date;

}

}

// 重写了 toString 方法

for (WeekEnum we : WeekEnum.values()) {

System.out.println(we);

}

运行结果:

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

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

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

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

运行结果:

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"));

}

}

运行结果:

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

使用枚举类实现接口

与普通类一样,枚举类也可以实现一个或多个接口。枚举类实现接口时,同样要实现

该接口的所有方法。

public interface GenderDescription {

public void info();

}

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

public enum Gender implements GenderDescription {

MALE,FEMALE;

@Override

public void info() {

System.out.println("这是一个用于定义性别的枚举类");

}

}

public class Test02 {

public static void main(String[] args) {

Gender.MALE.info();

Gender.FEMALE.info();

}

}

运行结果:

包含抽象方法的枚举类

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

public enum Operation {

// 用于执行加法运算

PLUS { // 花括号部分其实是一个匿名内部子类

@Override

public double calculate(double x, double y) {

return x + y;

}

},

// 用于执行减法运算

MINUS { // 花括号部分其实是一个匿名内部子类

@Override

public double calculate(double x, double y) {

// TODO Auto-generated method stub

return x - y;

}

},

// 用于执行乘法运算

TIMES { // 花括号部分其实是一个匿名内部子类

@Override

public double calculate(double x, double y) {

return x * y;

}

},

// 用于执行除法运算

DIVIDE { // 花括号部分其实是一个匿名内部子类

@Override

public 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));

}

}

运行结果:

参考资料

java enum变量_java enum相关推荐

  1. java enum使用_java enum用法详解

    我们都知道,enum是java的一个语法糖,实际编译后的文件仍然是一个java类,今天我们就拨开语法糖的外衣,看一看原始的java类应该是什么样的. 首先写一个enum类: enum Color { ...

  2. java循环变量_Java初学——Java入门变量 常量选择循环结构

    一.初识java 1.jdk的介绍 下载安装jdk 安装后会存在默认的安装路径 bin 目录:存放编译,运行 Java 程序的可执行文件 lib 目录:存放 Java 的类库文件 jre 目录:存放 ...

  3. java环境变量_java环境变量

    1. PATH环境变量.作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序.我们需要把 jdk安装目录下的bin目录增加到现有的PATH ...

  4. java enum 变量_java枚举使用详解

    package com.ljq.test; /** * 枚举用法详解 * * @author jiqinlin * */ public class TestEnum { /** * 普通枚举 * * ...

  5. java enum判断_Java Enum枚举 遍历判断 四种方式(包括 Lambda 表达式过滤)

    packagecom.miracle.luna.lambda;importjava.util.Arrays;/*** @Author Miracle Luna * @Date 2019/6/9 23: ...

  6. java基础变量_Java基础语法之变量和常量

    上行没有"{"时,下行代码与上行首字母对齐 标识符 概述 在Java中对变量.常量.函数和语句块都是有名字的,他们的名字统称为Java标识符.是为类.对象.方法.变量.接口和自定义 ...

  7. java switch 变量_Java switch 用法实例

    首页 > 基础教程 > 循环条件语句 > 条件语句switch Java switch 用法实例 switch允比对一个变量的值,来执行不同情况的代码.switch使用规则如下: 1 ...

  8. java类名变量_java类名操作变量方法

    JAVA中包括成员变量的定义和方法的定义,而成员变量的定义又包括类变量和实例变量的定义:其中用static 修饰的是类变量,而其他是实例变量. 实例变量和类变量的区别:一个类通过使用new 运算符可以 ...

  9. java引用变量_java代码声明引用变量经验

    1.static只能修饰类的成员变量,不能修饰方法里的局部变量. 因为static是在类加载时候将成员变量存储进方法区的. 加载类的时候,是不去执行方法里的函数的.所以不会馆方法里的代码,自然就不会读 ...

最新文章

  1. Await, and UI, and deadlocks! Oh my!
  2. R语言ggplot2可视化自定义多个图例(legend)标签之间的距离实战(例如,改变数据点颜色和数据点大小图例之间的距离)
  3. 我的编码规范(慢慢补充)
  4. CI/CD with drone
  5. linux 历史命令列表,fc – 显示历史列表中的命令或修改指定的历史命令并执行。 - Linux 命令大全...
  6. list 分组_「正则表达式」 匹配分组
  7. 在ASP.NET Core中使用AOP来简化缓存操作
  8. Wasserstein metric的通俗解释
  9. VALSE 2020 线上大会简明日程发布(7月31日-8月5日)
  10. pymysql使用变化的变量,构造SQL语句
  11. 天载股票开户美股再度创出新高
  12. Go语言安装与环境配置(基于Windows)
  13. Android - 控件android:ems属性
  14. 基于区块链Baas平台的跨链实践
  15. 英语口语练习五十五之英语委婉提建议
  16. shell脚本编程基础(上)
  17. jQuery实现密保互斥问题
  18. UI自动化测试(一)
  19. 小程序一键生成系统网站源码
  20. 帝国cms e loop php,帝国CMS灵动标签e:loop的使用

热门文章

  1. 【微软亚洲研究院MSRA】招聘多模态方向算法实习生
  2. AI面试官也太好骗了吧!
  3. 再见QQ,再见QQ游戏!
  4. 整理一周的Python资料,包含各阶段所需网站、项目,2020燥起来!
  5. 你离时间管理大师,就差这副眼镜了
  6. 为什么MySQL数据库要用B+树存储索引?
  7. coverage代码覆盖率测试工具:基本原理分析与使用
  8. Emmet语法(快速生成HTML结构语法、快速生成CSS样式语法)
  9. PyCharm代码回滚,恢复历史版本
  10. Linux 内核测试版与稳定版的版本号有什么不同?