资讯专栏INFORMATION COLUMN

Java枚举全解析

Eidesen / 3344人阅读

摘要:关键字与和地位相同,其一样有成员变量方法可以实现一个或多个接口,也可以有构造器枚举类与普通类的区别枚举类的父类是类非抽象枚举类默认使用修饰,不能存在子类枚举类的构造器只能使用修饰符,默认就是枚举类的所有实例必须在枚举类的第一行显式列出,否则

enum关键字与class和interface地位相同,其一样有成员变量、方法、可以实现一个或多个接口,也可以有构造器

枚举类与普通类的区别

枚举类的父类是java.lang.Enum类

非抽象枚举类默认使用final修饰,不能存在子类

枚举类的构造器只能使用private修饰符,默认就是private

枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远不能产生实例,列出的实例,系统会自动添加public static final修饰

</>复制代码

  1. 抽象的枚举类,系统默认使用abstract修饰,而不用final修饰

</>复制代码

  1. package com.em;
  2. public enum EmFestival {
  3. //会产生如下四个实例
  4. SPRING,SUMMER,FALL,WINTER;
  5. }

</>复制代码

  1. 枚举值就代表可能会产生的实例

</>复制代码

  1. package com.em;
  2. public class FestivalTest {
  3. public static String jude(EmFestival v){
  4. switch (v) {
  5. case SPRING:
  6. return "春天";
  7. case SUMMER:
  8. return "夏天";
  9. case FALL:
  10. return "秋天";
  11. case WINTER:
  12. return "冬天";
  13. }
  14. return null;
  15. }
  16. public static void main(String[] args) {
  17. System.out.println(jude(EmFestival.SPRING));
  18. }
  19. }
为什么使用枚举类?

存在命名空间,可以将其他的静态常量区分开

打印输出的意义明确,不想普通常量那样,都用数字表示含义,无法直接表达含义

枚举类方法

compare(E o):用于与指定的枚举对象比较顺序,同一个枚举实例只能与相同类型的枚举实例进行比较。如果该枚举对象位于指定枚举对象之后,则返回正整数

name():返回此枚举实例的名称

ordinal():返回枚举值在枚举类中的索引值(从0开始)

toString():与name方法一致,推荐使用toString

valueOf():一个静态方法,用于返回指定枚举类中指定名称的枚举值

</>复制代码

  1. package com.em;
  2. public enum EmFestival {
  3. //会产生如下四个实例
  4. SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天");
  5. private final String fest;
  6. private EmFestival(String fest){
  7. this.fest=fest;
  8. }
  9. public String getFest() {
  10. return fest;
  11. }
  12. }
实现接口的枚举类

枚举类实现接口,与正常类没有什么区别

</>复制代码

  1. package com.em;
  2. import java.io.FileDescriptor;
  3. import java.io.IOException;
  4. import sun.nio.ch.SelChImpl;
  5. import sun.nio.ch.SelectionKeyImpl;
  6. public enum EmFestival implements SelChImpl{
  7. // 会产生如下四个实例
  8. SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天");
  9. @Override
  10. public boolean isOpen() {
  11. // TODO Auto-generated method stub
  12. return false;
  13. }
  14. @Override
  15. public void close() throws IOException {
  16. // TODO Auto-generated method stub
  17. }
  18. @Override
  19. public FileDescriptor getFD() {
  20. // TODO Auto-generated method stub
  21. return null;
  22. }
  23. @Override
  24. public int getFDVal() {
  25. // TODO Auto-generated method stub
  26. return 0;
  27. }
  28. @Override
  29. public void kill() throws IOException {
  30. // TODO Auto-generated method stub
  31. }
  32. @Override
  33. public void translateAndSetInterestOps(int arg0, SelectionKeyImpl arg1) {
  34. // TODO Auto-generated method stub
  35. }
  36. @Override
  37. public boolean translateAndSetReadyOps(int arg0, SelectionKeyImpl arg1) {
  38. // TODO Auto-generated method stub
  39. return false;
  40. }
  41. @Override
  42. public boolean translateAndUpdateReadyOps(int arg0, SelectionKeyImpl arg1) {
  43. // TODO Auto-generated method stub
  44. return false;
  45. }
  46. @Override
  47. public int validOps() {
  48. // TODO Auto-generated method stub
  49. return 0;
  50. }
  51. private final String fest;
  52. private EmFestival(String fest){
  53. this.fest=fest;
  54. }
  55. public String getFest() {
  56. return fest;
  57. }
  58. }
包含抽象方法的枚举类

枚举类里定义抽象方法时不能使用abstract关键字将枚举类定义成抽象类(因为系统自动会添加abastract),但因为枚举类需要显式创建枚举值,而不是作为父类,所以定义每个枚举值时必须为抽象方法提供实现,否则出现编译错误

</>复制代码

  1. package com.em;
  2. public enum EmFestival {
  3. // 会产生如下四个实例
  4. SPRING("春天") {
  5. @Override
  6. public String getFestival() {
  7. return "春天";
  8. }
  9. },
  10. SUMMER("夏天") {
  11. @Override
  12. public String getFestival() {
  13. return "夏天";
  14. }
  15. },
  16. FALL("秋天") {
  17. @Override
  18. public String getFestival() {
  19. return "秋天";
  20. }
  21. },
  22. WINTER("冬天") {
  23. @Override
  24. public String getFestival() {
  25. return "冬天";
  26. }
  27. };
  28. public abstract String getFestival();
  29. private final String fest;
  30. private EmFestival(String fest) {
  31. this.fest = fest;
  32. }
  33. public String getFest() {
  34. return fest;
  35. }
  36. }

更多内容可以关注微信公众号,或者访问AppZone网站

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65987.html

相关文章

  • Javag工程师成神之路(2019正式版)

    摘要:结构型模式适配器模式桥接模式装饰模式组合模式外观模式享元模式代理模式。行为型模式模版方法模式命令模式迭代器模式观察者模式中介者模式备忘录模式解释器模式模式状态模式策略模式职责链模式责任链模式访问者模式。 主要版本 更新时间 备注 v1.0 2015-08-01 首次发布 v1.1 2018-03-12 增加新技术知识、完善知识体系 v2.0 2019-02-19 结构...

    Olivia 评论0 收藏0
  • Java知识点总结 (基本语法)

    摘要:强制类型转换下标运算符变量与常量常量是在程序中的不会变化的数据变量其实就是内存中的一个存储空间,用于存储数据。表示结束本次循环,继续下次循环。 Java知识点总结 (基本语法) @(Java知识点总结)[Java, Java基本语法] @(Java开发)[Java基本语法] [toc] Java特点 简单自然平台可移植性支持函数式编程JIT 编译更好的并发编程健壮安全 执行方式 编译...

    tuantuan 评论0 收藏0
  • Java枚举类学习到进阶

    摘要:枚举是声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。注意枚举只是枚举类型,不能够赋值操作。 枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。△有的地方还没有学的透彻,之后会继续学习修改更新本文章 1.枚...

    Juven 评论0 收藏0
  • Google Protobuf 编解码

    摘要:优点在谷歌内部长期使用产品成熟度高跨语言支持多种语言包括和编码后的消息更小更加有利于存储和传输编解码的性能非常高支持不同协议版本的前向兼容支持定义可选和必选字段的入门是一个灵活高效结构化的数据序列化框架相比与等传统的序列化工具它更小更快更简 Google Protobuf 优点: 在谷歌内部长期使用, 产品成熟度高. 跨语言、支持多种语言, 包括 C++、Java 和 Python....

    Eric 评论0 收藏0
  • Java 总结

    摘要:中的详解必修个多线程问题总结个多线程问题总结有哪些源代码看了后让你收获很多,代码思维和能力有较大的提升有哪些源代码看了后让你收获很多,代码思维和能力有较大的提升开源的运行原理从虚拟机工作流程看运行原理。 自己实现集合框架 (三): 单链表的实现 自己实现集合框架 (三): 单链表的实现 基于 POI 封装 ExcelUtil 精简的 Excel 导入导出 由于 poi 本身只是针对于 ...

    caspar 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<