枚举

将一组有限集合创建为一种新的类型,集合里面的值可以作为程序组件使用;

枚举基本特性

以下代码是枚举的简单使用:

使用values方法返回enum实例的数组

使用ordinal方法返回每个enum实例的次序,从0开始

使用compareTo方法比较两个enum实例

使用==来比较enum实例

使用getDeclaringClass方法返回enum实例所属的enum类

使用valueOf方法根据指定的名字返回enum实例

package enumerated;enum Shrubbery {GROUND, CRAWLING, HANGING
}public class EnumClass {public static void main(String[] args) {for (Shrubbery s : Shrubbery.values()) {System.out.println(s + " ordinal: " + s.ordinal());System.out.println(s.compareTo(Shrubbery.CRAWLING) + " ");System.out.println(s.equals(Shrubbery.CRAWLING) + " ");System.out.println(s == Shrubbery.CRAWLING);System.out.println(s.getDeclaringClass());System.out.println(s.name());System.out.println("----------------------");}// Produce an enum value from a string name:for (String s : "HANGING CRAWLING GROUND".split(" ")) {Shrubbery shrub = Enum.valueOf(Shrubbery.class, s);System.out.println(shrub);}}
}

注意枚举enum默认是继承自java.lang.Enum类的,在以上代码中,Shrubber为一个枚举类, GROUND, CRAWLING, HANGING为这个enum类的实例,由于Shrubber已经继承自java.lang.Enum类,所以它是不能在继承其它enum类的;

另外,在使用枚举的时候,可以考虑使用静态导入枚举类型,省去使用枚举类型修饰枚举实例;

向enum中添加方法

enum基本上是可以被看做一个常规的类,可以向其添加方法,甚至main方法;

如下代码,在枚举类内部添加一个构造方法和getDescription方法, 注意,当定义自己方法的时候,需要在enum实例序列的最后一个后面添加分号,且要先定义enum实例再定义方法;

package enumerated;public enum OzWitch {// Instances must be defined first, before methods:WEST("Miss Gulch, aka the Wicked Witch of the West"), NORTH("Glinda, the Good Witch of the North"), EAST("Wicked Witch of the East, wearer of the Ruby Slippers, crushed by Dorothy's house"), SOUTH("Good by inference, but missing");private String description;// Constructor must be package or private access:private OzWitch(String description) {this.description = description;}public String getDescription() {return description;}public static void main(String[] args) {for (OzWitch witch : OzWitch.values())System.out.println(witch + ": " + witch.getDescription());}
}

再看一个例子,覆盖Enum类的方法,如下代码,覆盖toString方法,将枚举的name首字母大写,其余转为小写,:

package enumerated;public enum SpaceShip {SCOUT, CARGO, TRANSPORT, CRUISER, BATTLESHIP, MOTHERSHIP;public String toString() {String id = name();String lower = id.substring(1).toLowerCase();return id.charAt(0) + lower;}public static void main(String[] args) {for (SpaceShip s : values()) {System.out.println(s);}}
}

在switch中使用枚举

如下代码是枚举在switch语句中的使用,注意在case语句里,枚举实例前面是不需要写上枚举类型的,强行写上(如Signal.RED)编译器会报错;

package enumerated;// Define an enum type:
enum Signal {GREEN, YELLOW, RED,
}public class TrafficLight {Signal color = Signal.RED;public void change() {switch (color) {// Note that you don't have to say Signal.RED// in the case statement:case RED:color = Signal.GREEN;break;case GREEN:color = Signal.YELLOW;break;case YELLOW:color = Signal.RED;break;}}public String toString() {return "The traffic light is " + color;}public static void main(String[] args) {TrafficLight t = new TrafficLight();for (int i = 0; i < 7; i++) {System.out.println(t);t.change();}}
}

关于枚举中的values()方法

我们已经知道枚举类是继承java.lang.Enum类的,但是查看Enum源代码却没有发现有values()方法,那么values()方法是哪里来的呢?

答案是,values()方法是由编译器添加的静态方法,有兴趣可以利用反射机制去查看,如上面的例子,可以编写如下代码查看:

Method[] methods = Signal.class.getMethods();

其它补充

看一个例子就好,如下:

基本可以把枚举当成一个类来使用;

//Color继承自Enum
public enum Color {//Color实例RED("Red"), YELLOW("Yellow"), //Color实例,继承自ColorBLUE("Blue") {@Overridepublic String getDescription() {//调用父类的test方法,BLUE实例是继承自Color的super.test();return super.getDescription();}//重写父类Color的toString方法
        @Overridepublic String toString() {return "蓝色";}};private String description;private Color(String description) {this.description = description;}public String getDescription() {return description;}//重写父类Enum的toString方法
    @Overridepublic String toString() {return this.description;}public void test() {System.out.println("hi~");}public static void main(String[] args) {//调用Color.BLUE实例的getDescription方法
        Color.BLUE.getDescription();//Color.RED是Color的一个实例,Color继承自EnumEnum<Color> red = Color.RED;System.out.println(red);//调用Color的toString//调用Color.BLUE的toString
        System.out.println(Color.BLUE);}
}

参考资料:JAVA编程思想--4

JAVA中的枚举小结相关推荐

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

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

  2. c枚举类型enum例题_一篇文章让你详细了解Java中Enum枚举类的使用

    文章前记 程序员工作久了便可能整日忙碌于"增删改查"中,迷失方向,毫无进步. 该公众号致力于分享软件开发相关的原创干货,助你完成从程序员到架构师的进阶之路! 努力!做一个NB的Co ...

  3. JAVA中常见异常小结

    JAVA中常见异常小结 参考文章: (1)JAVA中常见异常小结 (2)https://www.cnblogs.com/lq147760524/p/6926175.html (3)https://ww ...

  4. java中的枚举_Java中的枚举

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

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

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

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

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

  7. 在java中关于枚举类型的特性_java枚举类型小结

    JDK5.0之前,我们一般选择使用 interface 来保存常量组,以此来弥补 JDK 中没有枚举类型的缺陷,从JDK5.0开始,Sun引进了一个全新的关键字 enum 来定义一个枚举类.同inte ...

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

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

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

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

最新文章

  1. matlab matlabpool,Matlab matlabpool函数undefined
  2. Vmware Workstation VMX 在资源管理器中杀不掉(虚拟机繁忙导致无法关机)
  3. Java基类共同属性设置_java – 你有一个Hibernate实体的基类吗?
  4. 最好机器学习NLP和python教程
  5. FileSystem close Exception
  6. RecyclerView高级控件-附实例【android专题】
  7. JavaWeb基础—项目名的写法
  8. centos8 安装docker_CentOS 8 安装 docker
  9. JS代码优化工具Prepack
  10. 【bzoj1010】玩具装箱toy——斜率优化dp
  11. 索尼入局电动汽车市场 宣布成立移动出行公司
  12. 在java保存游戏状态_保存游戏状态的最佳方法是什么?
  13. matlab牛顿插值法
  14. 开源代码检测FOSSID
  15. 【错题】#10兰州烧饼——思考角度的转换
  16. 股票分红信息 股票历次分红查询
  17. 量化投资为什么用python_1、量化投资—为什么选择Python?
  18. 厘摩(centimorgan,cM)到底是啥鬼
  19. Wps日期时间格式转文本、科学计数法转数字
  20. Win11系统点击wifi图标没有反应怎么解决?

热门文章

  1. PC远程控制 NetSupport Manager
  2. 分配性质是什么意思_苏教版六年级数学上册3.9按比分配问题(1)微课视频 | 练习...
  3. 分享Kali Linux 2016.2第36周镜像虚拟机
  4. mysql双数据源动态切换_Spring boot+Mybatis多数据源动态切换
  5. 拦截器获取请求参数post_「SpringBoot WEB 系列」RestTemplate 之自定义请求头
  6. 声网sdk android接入,Android 集成声网Agora 音视频实时通话(三)
  7. 波士顿动力机器狗入驻庞贝古城,还要钻盗洞打击违法犯罪
  8. 江行智能CTO樊小毅:AI+边缘计算驱动能源产业变革 | 量子位·视点分享回顾
  9. 大型神经网络可能初具意识:OpenAI首席科学家引争议,众大佬吵成一团
  10. 苹果5年来盈利首次未超预期,但大中华区营收暴增83%