Java语言中的数据类型可以分为两大类,分别是基本数据类型和引用数据类型。本篇文章要介绍的枚举,就是属于Java的引用数据类型。下面,将为大家详细介绍Java中的枚举,以及具体的使用案例。

一、文章序言

Java中引用类型:数组、类、接口、枚举、注解

枚举这个既熟悉又陌生的东西具体再哪里可以使用呢?

什么是枚举?

枚举是一个引用类型,枚举就是一个规定了取值范围的变量类型。

枚举变量不能使用其他的数据,只能使用枚举中常量赋值。提高程序安全性;

//格式:public enum 枚举名{ //枚举的取值范围 //枚举中可以生命方法
} 

枚举的使用场景介绍?

1、最常见的情况如星期,相关变量我们会在Java里面重复使用,在这里我们就可以来定义一个叫做“星期”的枚举。

public enum Day
{SUNDAY, MONDAY, TUESDAY, WEDNESDAY,THURSDAY, FRIDAY, SATURDAY
}

如果不定义成枚举,各位的写法就千奇百怪了,比如“周一”、“星期一”、“Monday”等,写法千奇百怪,定义枚举一目了然。

2、比如说季节的春夏秋冬,我们同样可以定义一个这样的变量来存储对应的季节。

public enum Season {SPRING,SUMMER,AUTUMN,WINTER;
}

3、英雄联盟里面,有很多职业,比如说”战士“、”法师“、”射手“……等职业。我们就可以定义一个叫”职业“的枚举类型;后台再其它地方哪里需要直接引用即可;

总结:枚举里面定义的就相当于是已经生成且固定的对象,你可以直接使用;如果Java代码里面与如上需要定义的常量可以直接定义一个枚举类;

定义枚举类型时本质上就是定义一个类别,只不过很多细节由编译器帮我们完成了,所以某些程度上,enum关键字的作用 就像是class或interface

1 枚举的本质:其实就是终止类,并继承Enum抽象类。

2 枚举中的变量,其实就是一个当前类型的静态常量。

解释:

当我们使用“enum”定义枚举类型时,实质上我们定义出来的类型继承自java.lang.Enum类型,而枚举的成员其实就是我们定义的枚举类型的一 个实例(Instance),他们都被预设为final,所以我们无法改变他们,他们也是static成员,所以我们可以通过类型名称直接使用他们,当然最重要的,他们都是公开的(public)。

二、代码实践

先定义一个枚举:季节枚举

//声明一个表示季节的枚举
public enum Season {SPRING,SUMMER,AUTUMN,WINTER;
}

枚举可以搭配switch语句使用:案例如下

public class TestSeasonEnum {public static void main(String[] args) {Season season = Season.SPRING;//switch小括号中的表达式类型可以是枚举类型switch(season){//每个case后的常量直接写枚举的取值范case SPRING:System.out.println("春天");break;case SUMMER:System.out.println("夏天");break;case AUTUMN:System.out.println("秋天");break;case WINTER:System.out.println("冬天");break;}}
}

输出结果

春天

为了加深理解,再举例一个错误的用法

​ An enum switch case label must be the unqualified name of an enumeration constant

注意,在switch中,不能使用枚举类名称,因为编译器会根据switch()的类型来判定每个枚举类型,在case中必须直接给出与()相同类型的枚举选项,而不能再有类型。

代码如上可以直接测试,建议实测

三、面试相关

来来来,刚好抽时间一起整理一下常见面试问题吧,然后相关解析已经附上详细代码学习,实践实践再实践!

1.枚举允许继承类吗?

枚举类使用enum定义后在编译后默认继承了java.lang.Enum类,而不是普通的继承Object类。enum声明类继承了Serializable和Comparable两个接口。且采用enum声明后,该类会被编译器加上final声明(同String),故该类是无法继承的。

所有枚举类都默认是Enum类的子类,无需我们使用extends来继承。

2.枚举允许实现接口吗?

枚举允许实现接口。因为枚举本身就是一个类,类是可以实现多个接口的。

public interface EnumInterface {public abstract void print();
}
public enum SizeEnum implements EnumInterface{BIG,MIDDLE,SMALL;@Overridepublic void print() {System.out.println("继承接口-重写方法一次");}
}

3.枚举可以用等号比较吗?

肯定,因为在Enum类里面,已经重写了equals方法,而方法里面比较就是直接使用==,来比较2个对象的。所以,你在外边直接使用==也是可以的。

4.可以继承枚举吗?

当然不能呀,枚举类默认继承了java.lang.Enum类,一个类怎么能继承两个类呢?

5.枚举可以实现单例模式吗?

枚举本身就是一种对单例设计模式友好的形式,它是实现单例模式的一种很好的方式。

public class InstanceDemo {/*** 构造方法私有化*/private InstanceDemo(){}/*** 返回实例* @return*/public static InstanceDemo getInstance() {return Singleton.INSTANCE.getInstance();}/*** 使用枚举方法实现单利模式*/private enum Singleton {INSTANCE;private InstanceDemo instance;/*** JVM保证这个方法绝对只调用一次*/Singleton() {instance = new InstanceDemo();}public InstanceDemo getInstance() {return instance;}}//测试一下public static void main(String[] args) {InstanceDemo one =  InstanceDemo.getInstance();InstanceDemo two =  InstanceDemo.getInstance();System.out.println(one);System.out.println(two);System.out.println(one == two);}
}

创建的对象相同

csdn.test.recursion.demo.InstanceDemo@74a14482
csdn.test.recursion.demo.InstanceDemo@74a14482
true

6.当使用compareTo()比较枚举时,比较的是什么?

int compareTo(E e):比较两个枚举常量谁大谁小,其实比较的就是枚举常量在枚举类中声明的顺序;返回值可以仔细看看源码;

一起看看,底层代码吧

 public final int compareTo(E o) {Enum<?> other = (Enum<?>)o;Enum<E> self = this;if (self.getClass() != other.getClass() && // optimizationself.getDeclaringClass() != other.getDeclaringClass())throw new ClassCastException();return self.ordinal - other.ordinal;}

举个例子你就能理解了

public class TestSeasonEnum {public static void main(String[] args) {Season season = Season.SPRING;Season season1 = Season.SUMMER;Season season2 = Season.AUTUMN;Season season3 = Season.WINTER;System.out.println(season.compareTo(season1));System.out.println(season.compareTo(season2));System.out.println(season.compareTo(season3));}
}

输出结课,详情参考源码一看便知道

-1
-2
-3

7. 当使用equals()比较枚举的时候,比较的是什么?

枚举类型的equals()方法比较的是枚举类对象的内存地址,作用与等号等价。

诚之和:Java基础知识枚举Enum类介绍以及案例使用详解相关推荐

  1. java基础知识-对象和类

    前言: 因为要准备Java面试,所有将java基础知识点重新复习一遍,主要笔记来源于菜鸟教程和java核心技术的书籍中,也有一些博客上的资料(这些只供我个人学习使用) Java 对象和类 对象:对象是 ...

  2. 【java基础知识】日期类

    目录 1.Date类 构造方法 2.SimpleDateFormat类 format() 日期工具案例 3.Calendar类 二月天案例 1.Date类 构造方法 Date d1 = new Dat ...

  3. Java基础篇(04):日期与时间API用法详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.时间和日期 在系统开发中,日期与时间作为重要的业务因素,起到十分关键的作用,例如同一个时间节点下的数据生成,基于时间范围的各种数据统计和分 ...

  4. java 泛化_Java语言class类用法及泛化(详解)

    这篇文章主要介绍了Java语言class类用法及泛化(详解),大家都知道Java程序在运行过程中,对所有的对象进行类型标识,也就是RTTI.这项信息记录了每个对象所属的类.虚拟机通常使用运行时类型信息 ...

  5. Java什么时候会触发类初始化及原理(详解)

    先上结论: 以下情况会触发类的初始化: 遇到new,getstatic,putstatic,invokestatic这4条指令: 使用java.lang.reflect包的方法对类进行反射调用: 初始 ...

  6. 【音视频第6天】基础知识-移动端实时音视频直播技术详解和开源工程WebRTC的技术原理和使用浅析

    本文是系列文章中的第1篇,本系列文章的大纲如下: <移动端实时音视频直播技术详解(一):开篇> <移动端实时音视频直播技术详解(二):采集> <移动端实时音视频直播技术详 ...

  7. JAVA基础知识回顾-----File类-----实用

    所在包:java.io 1.文件 Java对文件管理,主要用到了IO包下的File类:主要针对文件及文件目录名称的管理,不包括文件的内容        ①声明 Java代码   public clas ...

  8. JAVA基础知识之File类

    一.File类定义 1. File类主要是JAVA为文件这块的操作(如删除.新增等)而设计的相关类 2. File类的包名是java.io,其实现了Serializable, Comparable两大 ...

  9. Java基础学习总结(117)——Feign入门使用详解

    一,简介 Feign使得 Java HTTP 客户端编写更方便.Feign 灵感来源于Retrofit.JAXRS-2.0和WebSocket.Feign最初是为了降低统一绑定Denominator到 ...

最新文章

  1. Java程序启动同时复制resources下文件到jar包同级目录
  2. C语言程序设计输入x求函数y,C语言程序设计实践(OJ)-初识函数
  3. VSCODE打开野火电机代码需要增加的配置 c_cpp_properties.json
  4. 怎样写出没有bug的代码?
  5. java工程中的相关路径
  6. Magento网店自定义模板初探(1)——文件夹结构
  7. [译]概率论沉思录——第一章合情推理
  8. 最新ubuntu搭建公网个人邮件服务器(基于postfix,dovecot,mysql)
  9. 宝利通网闸怎么设置_polycomMCU操作指南
  10. 案例解析|自然保护区水资源远程监控方案
  11. 定时报警器课程设计(基于单片机)
  12. python 爬虫登录
  13. 数据库拆分的理解和案例(详细版)
  14. Win10 Build 14942 Edge浏览器闪退怎么解决?
  15. 2345输入法真是 大叉叉!!
  16. 实现财富自由最好的准备
  17. 《Python语言程序设计》第四章(选择)学习笔记
  18. AI2021下载Illustrator2021最新下载AI最新下载安装1分钟看完就会
  19. Spring源码之Enviroment
  20. 区块链开发语言python_区块链开发中经常使用的编程语言有哪些

热门文章

  1. BP神经网络python实现
  2. 【PDF软件篇】Windows最强大的PDF笔记编辑软件-Drawboard PDF旧版本安装教程
  3. 直播电商源码,通过vue实现直播聊天
  4. php定义全局变量的方法
  5. BufferGeometry(立体正方形案例,由三角形片组成)
  6. 四川移动IMS扩展————VOIP电话
  7. emd分解matlab程序
  8. MySQL全文搜索引擎mysqlcft
  9. OneDrive 设置同步任意文件夹
  10. 拥抱异构集成的新机遇,芯和半导体2021用户大会成功召开