一 枚举类型简介

在JDK1.5之前,Java是没有枚举类型的,只有:类和接口。当然,在一般情况下这两种类型就已经足够了,不过在某些特殊情况下就显得有点不合适了。比如:“春夏秋冬”组成的四季这个“数据集”就不能有其他元素;定义一个Color类,它只能有Red,Green,Blue这3个值。像这样只有几个固定的元素组成的“数据集”,其他的任何值都是非法的,这时我们就可以使用枚举类型。

enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中。如果想要在JDK1.5之前实现类似枚举的功能,就必须依靠类似以下这种代码来完成。

package javase.enumdemo;public class Color {/*** 定义三个实例化对象,同时构造方法私有化,外部想要取得Color类的实例* 就只能通过RED,GREEN和BLUE这三个对象* */public static final Color RED = new Color("红色");public static final Color GREEN = new Color("绿色");public static final Color BLUE = new Color("蓝色");private String name;/*** 构造方法私有化* */private Color(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public static void main(String[] args) {Color color_1 = Color.RED;System.out.println(color_1.getName());}}

输出:

红色

以上的代码还是有不少问题的,最明显的一点是:如果用户想要知道到底有多少种颜色可以使用,其实现的代码就不是那么简单,更别说加入到集合进行操作了。因此,枚举就是为了解决这些问题而产生的。

二 枚举类型的定义和常用方法

(1)定义:

[public] enum 枚举类型名称{

枚举对象1,枚举对象2,…,枚举对象n;

}

实例:

package javase.enumdemo;public enum Color_2 {/*** 定义了3个枚举类型* */RED,GREEN,BLUE;
}

(2)常用方法示例:

package javase.enumdemo;public class Color_2Demo {/*** 取出枚举内容* */public void getEnumContent() {Color_2 color = Color_2.RED;System.out.println(color);}/*** 遍历所有枚举内容* */public void forEachEnum() {for (Color_2 color : Color_2.values())System.out.println(color);}/*** switch判断* */public void switchPrintEnum() {for (Color_2 color : Color_2.values()) {switch (color) {case RED:System.out.println("红色");break;case GREEN:System.out.println("绿色");break;case BLUE:System.out.println("蓝色");break;default:System.out.println("未知颜色");break;}}}/*** 测试枚举的ordinal()和name()方法* */public void ordinalTest(){for(Color_2 color : Color_2.values()){//color.ordinal()  返回枚举常量的序数//color.name()     返回枚举常量的名称System.out.println(color.ordinal() + " --> " + color.name());}}public static void main(String[] args) {Color_2Demo color_2Demo = new Color_2Demo();color_2Demo.getEnumContent();System.out.println("******************http://www.zifangsky.cn**********************");color_2Demo.forEachEnum();System.out.println("******************http://www.zifangsky.cn**********************");color_2Demo.switchPrintEnum();System.out.println("******************http://www.zifangsky.cn**********************");color_2Demo.ordinalTest();}}

输出:

RED
******************http://www.zifangsky.cn**********************
RED
GREEN
BLUE
******************http://www.zifangsky.cn**********************
红色
绿色
蓝色
******************http://www.zifangsky.cn**********************
0 --> RED
1 --> GREEN
2 --> BLUE

三 为每一个枚举对象属性赋值

(1)通过构造方法为属性赋值

package javase.enumdemo;public enum Color_3 {RED("红色"),GREEN("绿色"),BLUE("蓝色");private String name;/*** 为枚举对象属性赋值* 第一种方式,通过构造方法* */private Color_3(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

测试:

package javase.enumdemo;public class Color_3Demo {public static void main(String[] args) {for (Color_3 color : Color_3.values())System.out.println(color.ordinal() + " --> " + color.name() + "("+ color.getName() + ")");}}

输出:

0 --> RED(红色)
1 --> GREEN(绿色)
2 --> BLUE(蓝色)

(2)通过setter方法为属性赋值

package javase.enumdemo;public enum Color_4 {RED,GREEN,BLUE;private String name;public String getName() {return name;}/*** 为枚举对象属性赋值* 第二种方式,通过setter方法* */public void setName(String name) {switch (this) {case RED:if("红色".equals(name))this.name = name;elseSystem.out.println("设置属性名称不恰当");break;case GREEN:if("绿色".equals(name))this.name = name;elseSystem.out.println("设置属性名称不恰当");break;case BLUE:if("蓝色".equals(name))this.name = name;elseSystem.out.println("设置属性名称不恰当");break;default:break;}}}

测试:

package javase.enumdemo;public class Color_4Demo {public static void main(String[] args) {Color_4 color = Color_4.BLUE;color.setName("红色");System.out.println(color.getName());  //设置不恰当,输出为:nullcolor.setName("蓝色");System.out.println(color.getName());}}

输出:

设置属性名称不恰当
null
蓝色

四 类集对枚举的支持——EnumMap和EnumSet

(1)EnumMap的简单使用

i)构造方法如下:

public EnumMap(Class<K> keyType)

ii)简单示例:

package javase.enumdemo;import java.util.EnumMap;
import java.util.Map;enum Color_5 {RED, GREEN, BLUE;
}public class EnumMapDemo {public static void main(String[] args) {Map<Color_5, String> map = new EnumMap<Color_5, String>(Color_5.class);map.put(Color_5.RED, "红色");map.put(Color_5.BLUE, "蓝色");//遍历for (Map.Entry<Color_5, String> mapEntry : map.entrySet())System.out.println(mapEntry.getKey().name() + " --> "+ mapEntry.getValue());}}

输出:

RED --> 红色
BLUE --> 蓝色

(2)EnumSet的几种常用方法示例:

package javase.enumdemo;import java.util.EnumSet;public class EnumSetDemo {/*** 将全部枚举类型添加到EnumSet集合中* */public void allOfTest(){EnumSet<Color_5> set = EnumSet.allOf(Color_5.class);for(Color_5 color : set)System.out.print(color + "\t");System.out.println();}/*** 只设置一个枚举类型到集合中* */public void ofTest(){EnumSet<Color_5> set = EnumSet.of(Color_5.BLUE);for(Color_5 color : set)System.out.println(color);}/*** 创建一个只能添加指定内容的空集合* */public void noneOfTest(){EnumSet<Color_5> set = EnumSet.noneOf(Color_5.class);set.add(Color_5.RED);set.add(Color_5.GREEN);for(Color_5 color : set)System.out.print(color + "\t");System.out.println();}/*** 创建不包含指定元素的集合* */public void complementOfTest(){EnumSet<Color_5> oldSet = EnumSet.of(Color_5.BLUE,Color_5.GREEN);EnumSet<Color_5> newSet = EnumSet.complementOf(oldSet);for(Color_5 color : newSet)System.out.print(color + "\t");System.out.println();}/*** 复制已有集合中的内容* */public void copyOfTest(){EnumSet<Color_5> oldSet = EnumSet.of(Color_5.RED,Color_5.GREEN);EnumSet<Color_5> newSet = EnumSet.copyOf(oldSet);for(Color_5 color : newSet)System.out.print(color + "\t");System.out.println();}public static void main(String[] args) {EnumSetDemo enumSetDemo = new EnumSetDemo();enumSetDemo.allOfTest();System.out.println("******************http://www.zifangsky.cn**********************");enumSetDemo.ofTest();System.out.println("******************http://www.zifangsky.cn**********************");enumSetDemo.noneOfTest();System.out.println("******************http://www.zifangsky.cn**********************");enumSetDemo.complementOfTest();System.out.println("******************http://www.zifangsky.cn**********************");enumSetDemo.copyOfTest();}}

输出:

RED  GREEN   BLUE
******************http://www.zifangsky.cn**********************
BLUE
******************http://www.zifangsky.cn**********************
RED GREEN
******************http://www.zifangsky.cn**********************
RED
******************http://www.zifangsky.cn**********************
RED GREEN   

五 让枚举类实现一个接口

枚举类实现一个接口,因为接口中含有抽象方法,因此枚举类中的每个对象都需要分别实现接口中的抽象方法,示例代码如下:

package javase.enumdemo;interface Print{public String getColor();
}
/*** 枚举类实现了一个接口Print* 因此枚举类中的每个对象都必须分别实现接口中的抽象方法* */
enum Page implements Print{WHITEPAGE{public String getColor() {return "白色";}  },BLUEPAGE{public String getColor() {return "蓝色";}},GRAYPAGE{public String getColor() {return "灰色";}};}public class InterfaceEnumDemo {public static void main(String[] args) {Page page = Page.GRAYPAGE;System.out.println(page.getColor());}}

输出:

灰色

六 在枚举类中定义抽象方法

跟前面枚举类实现一个接口类似,也需要枚举类中的每个对象分别实现其抽象方法,示例代码如下:

package javase.enumdemo;/*** 枚举中定义抽象方法* 同样,枚举类中的每个对象都必须分别实现该抽象方法* */
enum Person{STUDENT{public String getJobName() {return "学生";} },TEACHER{public String getJobName() {return "教师";}},PROGRAMMER{public String getJobName() {return "程序猿";}};public abstract String getJobName();  //抽象方法
}public class AbstractMethodDemo {public static void main(String[] args) {Person person = Person.PROGRAMMER;System.out.println(person.getJobName());}}

输出:

程序猿

转载于:https://blog.51cto.com/983836259/1740586

Java基础系列:(2)关于枚举的简单总结相关推荐

  1. 夯实Java基础系列14:深入理解Java枚举类

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  2. 夯实Java基础系列15:Java注解简介和最佳实践

    Java注解简介 注解如同标签 Java 注解概述 什么是注解? 注解的用处 注解的原理 元注解 JDK里的注解 注解处理器实战 不同类型的注解 类注解 方法注解 参数注解 变量注解 Java注解相关 ...

  3. 夯实Java基础系列19:一文搞懂Java集合类框架,以及常见面试题

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  4. string substring的用法_夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战...

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  5. 基础的java增删改查,Java基础系列(基础):Java使用Cookie增删改查操作!

    什么是Cookie? Cookie是由W3C组织提出,最早由NetScape社区发展的一种机制. Cookie是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个co ...

  6. [转载] 夯实Java基础系列8:深入理解Java内部类及其实现原理

    参考链接: Java内部类 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tut ...

  7. java基础系列十七(时间日期转换)

    目录 一.概述 二.基础知识 2.1 时区 2.2 格林威治时间 2.3 时间戳 三.Date/Calendar/SimpleDateFormat 3.1 Date 3.2 Calendar 3.3 ...

  8. 知其然,知其所以然之Java基础系列(一)

    相信大家在最初接触Java基础学习的时候,也只是跟着课本上的描述学习,知其然,不知所以然,要想成为一个Java老鸟,不仅要学会怎么用,也要知道为何这么用.在Java基础系列的博客中,我会列举一系列大家 ...

  9. 夯实Java基础系列9:深入理解Class类和Object类

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  10. 夯实Java基础系列11:深入理解Java中的回调机制

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

最新文章

  1. php mysql study_phpStudy 升级 MySQL5.7
  2. ubuntu16.04安装UR3/UR5/UR10机械臂的ROS驱动并实现gazebo下Moveit运动规划仿真以及真实UR3机械臂的运动控制(2)
  3. python编写一个程序、实现文件的复制_写个python 脚本实现文件的递归拷贝
  4. RabbitMQ惰性队列
  5. arm linux 添加ntp服务,嵌入式linux添加NTP服务
  6. Keil使用PC-Lint
  7. 【离散数学中的数据结构与算法】三 同余定理
  8. innobackupex和Xtrabackup备份和恢复MySQL数据
  9. error: #error This file requires compiler and library support for the ISO C++ 2011 standard.
  10. 手机应用只清理不够,还要卸载
  11. 高质量程序设计指南c++/c语言(19)--赋值操作符“=”
  12. 基于FPGA的CIC滤波器设计(1)
  13. 射频IC行业为何这么惨?——RFIC的尴尬的现实和迷茫的未来
  14. 外贸自建站优势渐明,你还要观望多久!2018加油
  15. 引用启动类型“WebService.Startup”的 OwinStartup 属性 冲突
  16. 换肤方案,换肤策略,App插件式换肤实现方案
  17. python处理adb截屏_《自拍教程38》Python_adb一键截屏
  18. 微信群裂变引流效果怎么样?微信社群引流怎么操作?
  19. Android 搭建Linux服务器
  20. stm32mp157开发板常用系统工具使用

热门文章

  1. 德勤发布《中国智能制造分析报告》
  2. 焦李成教授谈深度神经网络发展历程
  3. 细胞内钾多钠少——原初生物的第三大遗迹?
  4. 如何体现机器智能和群体智能的关系,2018新版互联网大脑模型绘制
  5. 干货|重磅发布:人工智能行业应用价值报告(PDF报告下载)
  6. 重磅 | MIT启动IQ计划:研究人类智能,让全世界的机构共同合作
  7. 夏天写代码真难!16G 内存根本不够用! | 每日趣闻
  8. 网速,果然如此!| 每日趣闻
  9. 关于 Nginx 配置 WebSocket 400 问题
  10. java-结合c3p0封装的db 事务 类