概念:

Java1.5发行版本中增加了新的引用类型--枚举类型(enum type)。枚举类型是指由一组固定的常量组成合法值的类型。在Java虚拟机中,枚举类在进行编译时会转变成普通的Java类。

创建枚举类型要使用enum关键字,隐含了所创建的类型都是java.lang.Enum类的子类(java.lang.Enum是一个抽象类)。枚举类型的通用格式为Class Enum<E extends Enum<E>>,而E表示枚举类型的名称。枚举类型的每一个值都会映射到protected Enum(String name,int ordinal)构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。源码如下:

/*** This is the common base class of all Java language enumeration types.
*/
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {private final String name;private final int ordinal;/*** Sole constructor.  Programmers cannot invoke this constructor.* It is for use by code emitted by the compiler in response to enum type declarations.*/protected Enum(String name, int ordinal) {this.name = name;this.ordinal = ordinal;}
}

以前我们定义常量都是: public static final....现在好了,当定义一个枚举类型时,每一个枚举类型成员都可以看作是 Enum 类的实例,这些枚举成员默认都被 final、public, static 修饰,当使用枚举类型成员时,直接使用枚举名称调用成员即可。

public enum Color {  RED, GREEN, BLANK, YELLOW
}

方法介绍:

例 1

下面代码定义了一个表示性别的枚举类型 SexEnum 和一个表示颜色的枚举类型 Color。

public enum SexEnum
{male,female;
}
public enum Color
{RED,BLUE,GREEN,BLACK;
}

之后便可以通过枚举类型名直接引用常量,如 SexEnum.male、Color.RED。

使用枚举还可以使 switch 语句的可读性更强,例如以下示例代码:

enum Signal
{//定义一个枚举类型GREEN,YELLOW,RED
}
public class TrafficLight
{Signal color=Signal.RED;public void change(){switch(color){case RED:color=Signal.GREEN;break;case YELLOW:color=Signal.RED;break;case GREEN:color=Signal.YELLOW;break;}}
}

例 2

通过调用枚举类型实例的 values() 方法可以将枚举的所有成员以数组形式返回,也可以通过该方法获取枚举类型的成员。

下面的示例创建一个包含 3 个成员的枚举类型 Signal,然后调用 values() 方法输出这些成员。

enum Signal
{//定义一个枚举类型GREEN,YELLOW,RED;
}
public static void main(String[] args)
{for(int i=0;i<Signal.values().length;i++){System.out.println("枚举成员:"+Signal.values()[i]);}
}

输出结果如下:

枚举成员:GREEN
枚举成员:YELLOW
枚举成员:RED

例 3

创建一个示例,调用valueOf() 方法获取枚举的一个成员,再调用 compareTo() 方法进行比较,并输出结果。具体实现代码如下:

public class TestEnum
{public enum Sex{//定义一个枚举male,female;}public static void main(String[] args){compare(Sex.valueOf("male"));    //比较}public static void compare(Sex s){for(int i=0;i<Sex.values().length;i++){System.out.println(s+"与"+Sex.values()[i]+"的比较结果是:"+s.compareTo(Sex.values()[i]));}}
}

上述代码中使用 Sex.valueOf("male") 取出枚举成员 male 对应的值,再将该值与其他枚举成员进行比较。最终输出结果如下:

male与male的比较结果是:0
male与female的比较结果是:-1

例 4

通过调用枚举类型实例的 ordinal() 方法可以获取一个成员在枚举中的索引位置。下面的示例创建一个包含 3 个成员的枚举类型 Signal,然后调用 ordinal() 方法输出成员及对应索引位置。

具体实现代码如下:

public class TestEnum1
{enum Signal{//定义一个枚举类型GREEN,YELLOW,RED;}public static void main(String[] args){for(int i=0;i<Signal.values().length;i++){System.out.println("索引"+Signal.values()[i].ordinal()+",值:"+Signal.values()[i]);}}
}

输出结果如下:

索引0,值:GREEN
索引1,值:YELLOW
索引2,值:RED

为枚举添加方法

Java 为枚举类型提供了一些内置的方法,同时枚举常量也可以有自己的方法。此时要注意必须在枚举实例的最后一个成员后添加分号,而且必须先定义枚举实例。

例 5

下面的代码创建了一个枚举类型 WeekDay,而且在该类型中添加了自定义的方法。

enum WeekDay
{Mon("Monday"),Tue("Tuesday"),Wed("Wednesday"),Thu("Thursday"),Fri("Friday"),Sat("Saturday"),Sun("Sunday");//以上是枚举的成员,必须先定义,而且使用分号结束private final String day;private WeekDay(String day){this.day=day;}public static void printDay(int i){switch(i){case 1:System.out.println(WeekDay.Mon);break;case 2:System.out.println(WeekDay.Tue);break;case 3:System.out.println(WeekDay.Wed);break;case 4:System.out.println(WeekDay.Thu);break;case 5:System.out.println(WeekDay.Fri);break;case 6:System.out.println(WeekDay.Sat);break;case 7:System.out.println(WeekDay.Sun);break;default:System.out.println("wrong number!");}}public String getDay(){return day;}
}

上面代码创建了 WeekDay 枚举类型,下面遍历该枚举中的所有成员,并调用 printDay() 方法。示例代码如下:

public static void main(String[] args)
{for(WeekDay day:WeekDay.values()){System.out.println(day+"====>"+day.getDay());}WeekDay.printDay(5);
}

输出结果如下:

Mon====>Monday
Tue====>Tuesday
Wed====>Wednesday
Thu====>Thursday
Fri====>Friday
Sat====>Saturday
Sun====>Sunday
Fri

Java 中的 enum 还可以跟 Class 类一样覆盖基类的方法。下面示例代码创建的 Color 枚举类型覆盖了 toString() 方法。

public class Test
{public enum Color{RED("红色",1),GREEN("绿色",2),WHITE("白色",3),YELLOW("黄色",4);//成员变量private String name;private int index;//构造方法private Color(String name,int index){this.name=name;this.index=index;}//覆盖方法@Overridepublic String toString(){return this.index+"-"+this.name;}}public static void main(String[] args){System.out.println(Color.RED.toString());    //输出:1-红色}
}

EnumMap 与 EnumSet

为了更好地支持枚举类型,java.util 中添加了两个新类:EnumMap 和 EnumSet。使用它们可以更高效地操作枚举类型。具体就后面再说吧。

Java 枚举(enum)详解相关推荐

  1. Java 枚举(enum) 详解7种常见的用法<详细>

    JDK1.5引入了新的类型--枚举.在 Java 中它虽然算个"小"功能,却给我的开发带来了"大"方便. 大师兄我[大师兄]又加上自己的理解,来帮助各位理解一下 ...

  2. Java 枚举(enum) 详解7种常见的用法-小白笔记

    目录 用法一:常量 用法二:switch 用法三:向枚举中添加新方法 用法四:覆盖枚举的方法 用法五:实现接口 用法六:使用接口组织枚举 用法七:关于枚举集合的使用 用法一:常量 在JDK1.5 之前 ...

  3. Java (枚举) Enum 详解

    枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数.枚举在日常生活中很常见,例如表示星期的SUNDAY.MONDAY.TUESDAY.WEDNESDAY.THURSDAY.FRIDAY.SA ...

  4. Java 枚举(enum) 详解7种常见的用法

    JDK1.5引入了新的类型--枚举.在 Java 中它虽然算个"小"功能,却给我的开发带来了"大"方便. 大师兄我[大师兄]又加上自己的理解,来帮助各位理解一下 ...

  5. Java 枚举(1): 详解7种常见的用法

    目录 用法一:常量 用法二:switch 用法三:向枚举中添加新方法 用法四:覆盖枚举的方法 用法五:实现接口 用法六:使用接口组织枚举 用法七:关于枚举集合的使用 JDK1.5引入了新的类型--枚举 ...

  6. java枚举使用详解

    http://www.cnblogs.com/linjiqin/archive/2011/02/11/1951632.html java枚举使用详解 在实际编程中,往往存在着这样的"数据集& ...

  7. 枚举(enum) 详解7种常见的用法

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static final.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. J ...

  8. Java 枚举(enum) 7种常见的用法

    在JDK1.5引入了新的类型--枚举.在 Java 中它虽然算个"小"功能,却给我的开发带来了"大"方便. 用法一:常量 在JDK1.5 之前,我们定义常量都是 ...

  9. Java(enum)枚举用法详解

    转载自 Java(enum)枚举用法详解 本篇文章主要介绍了Java 枚举用法详解,枚举的好处:可以将常量组织起来,统一进行管理.有兴趣的可以一起来了解一下. 概念 enum的全称为 enumerat ...

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

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

最新文章

  1. EOJ Monthly 2020.7 Sponsored by TuSimple 部分题解
  2. 生成打印条码_条码打印软件如何生成跳号条形码
  3. 【zookeeper+Dubbo】Dubbo与SpringBoot整合的三种方式
  4. DeepEarth更新到Silverlight 4了
  5. 内存经销商穷困潦倒 七元午饭都赊账
  6. java 分页原理_关于javaweb分页原理
  7. laravel 淘宝 NPM 镜像
  8. 一步一步写算法(之 算法总结)
  9. Maven创建servlet项目演示(三)
  10. 2021-06-26JS基本语法 入门
  11. Python语法学习第三天--元组
  12. android小应用帮美女更衣系列一(附源码)
  13. 使用ACR122U NFC读卡器对M1卡进行读写操作(可以读写中文)
  14. zabbix自定义监控之声音报警、用户和组权限
  15. mybatis sql语句格式化 trim prefix suffix
  16. Re-parameterizing Your Optimizers rather than Architectures
  17. 【BZOJ 2054】 疯狂的馒头
  18. 密码学——对称加密加密模式
  19. 基于matlab的锁相环频率合成器,基于MATLAB锁相环.ppt
  20. 游程编码压缩及解压缩

热门文章

  1. MATLAB实现直方图均衡化与规定化
  2. 阿里云API网关相关操作
  3. opencv中的threshold()函数(二值化)
  4. 短视频SDK架构设计,短视频APP开发目标首选
  5. GNOME 的新夜灯功能旨在帮助你睡得更好
  6. 5分钟搞定开机引导界面
  7. Solr配置与简单Demo[转]
  8. 网页简单配置捉取网购信息
  9. error BK1506
  10. QQ“远程协助”文字输入技巧