Java学习——枚举类

摘要:本文主要介绍了Java的枚举类。

部分内容来自以下博客:

https://www.cnblogs.com/sister/p/4700702.html

https://blog.csdn.net/zhou520yue520/article/details/80952404

为什么使用枚举类

枚举类更加直观,类型安全。使用常量会有以下几个缺陷:

类型不安全。若一个方法中要求传入季节这个参数,用常量的话,形参就是int类型,开发者传入任意类型的int类型值就行,但是如果是枚举类型的话,就只能传入枚举类中包含的对象。

没有命名空间。开发者要在命名的时候以SEASON_开头,这样另外一个开发者再看这段代码的时候,才知道这四个常量分别代表季节。

枚举类的语法

枚举类默认继承java.lang.Enum类,而不是Object类,因此枚举类不能显示继承其他父类。

使用enum定义的非抽象的枚举类默认会使用final修饰,因此非抽象枚举类不能派生子类(即不能被继承)。不过,并不是所有的枚举类都使用了final修饰,非抽象的枚举类才默认使用final修饰。对于一个抽象的枚举类(只要它包含了抽象方法,它就是抽象枚举类)而言,系统默认使用abstract修饰,而不是final。

枚举类的构造器只能使用private访问控制符,如果忽略访问控制符的话,则默认使用private修饰,如果强制指定其他的访问控制符(例如public、procted等),则会报错。

枚举类的所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远都不可能产生实例。列出的这些实例,系统会自动给它们加上public static final修饰。枚举类的实例以逗号分隔,分号结束,这些列出的枚举值代表了该枚举类的所有可能的实例。

枚举类的用法

Switch对枚举类的扩展

switch的控制表达式(即括号中的条件)可以是任何枚举类型;当switch控制表达式使用枚举类型时,后面case表达式中的值可以直接使用枚举值的名字,而无需添加枚举类作为限定(不需要而且也不能这样写:SeasonEnum.SPRING)。

创建枚举类:

1 public enumSeasonEnum {2 SPRING, SUMMER, AUTUMN , WINTER;3 }

在switch控制表达式里使用枚举类:

1 public voidtest(SeasonEnum season) {2 switch(season) {3 caseSPRING:4 System.out.println("春天");5 break;6 caseSUMMER:7 System.out.println("夏天");8 break;9 caseAUTUMN:10 System.out.println("秋天");11 break;12 caseWINTER:13 System.out.println("冬天");14 break;15 default:16 break;17 }18 }

获取枚举类所有实例

枚举类默认有一个values()方法(不是继承来的),可以返回该枚举类的所有实例。

1 public voidtest() {2 SeasonEnum[] values =SeasonEnum.values();3 for(SeasonEnum season : values) {4 System.out.println(season);5 }6 }

枚举类的成员变量、方法和构造器

枚举类是一种特殊的类,它一样可以有自己的成员变量、方法,可以有自己的构造器,也可以实现一个或多个接口,但不能继承其他的类。

成员变量

枚举类的每个实例的成员变量的值(即对应的含义)应该是不能改变的,而且不需要使用修饰符修饰。

方法和构造器

所有成员变量都使用final修饰,则必须使用下面三种方法为成员变量指定初始值:

1. 在构造器里为这些成员变量指定初始值。

2. 在定义成员变量时指定默认值。

3. 在初始化块中指定初始值。

实际上,后面两种方式并不常用。所以,应该为枚举类显示定义带参数的构造器。一旦为枚举类显示定义了带参数的构造器,列举枚举值时就必须对应的传入参数。

1 public enumSeasonEnum {2 SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天") , WINTER("冬天");3

4 String name;5

6 privateSeasonEnum(String name) {7 this.name =name;8 }9

10 public voidshowNam() {11 System.out.println(name);12 }13 }

在第一行列出所有枚举值(实例)时,实际上就是调用了构造器创建枚举类对象;只是这里不需要使用new关键字,也无需显示调用构造器罢了。

如果在定义SeasonEnum时,没有传入参数,甚至没有使用括号,那么使用的就是SeasonEnum里默认的无参构造器。

实现接口的枚举类

如果枚举类实现了接口,可以给每个实例提供不同的实现方式。

定义一个接口:

1 public interfaceFeature {2 public voidshowFeature();3 }

普通方式由枚举类实现接口的方法

由枚举类来实现接口里的方法,这种方式会导致每个枚举类的实例调用的都是同一个方法。

1 public enum SeasonEnum implementsFeature {2 SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天") , WINTER("冬天");3

4 String name;5

6 privateSeasonEnum(String name) {7 this.name =name;8 }9

10 public voidshowNam() {11 System.out.println(name);12 }13

14 @Override15 public voidshowFeature() {16 System.out.println("一年四季,春夏秋冬。");17 }18 }

每个枚举类的实例各自实现不同的方法

当每个枚举实例分别实现方法时,在枚举实例调用方法时就会呈现出不同的行为方式。

上面这种在枚举值后面紧跟花括号的语法其实是创建匿名内部类的语法,花括号就是类体部分。当创建枚举类的实例时,并不是直接创建,而是相当于创建匿名子类的实例。

1 public enum SeasonEnum implementsFeature {2 SPRING("春天") {3 @Override4 public voidshowFeature() {5 System.out.println("春光明媚,鸟语花香。");6 }7 }, SUMMER("夏天") {8 @Override9 public voidshowFeature() {10 System.out.println("烈日炎炎,酷暑难耐。");11 }12 }, AUTUMN("秋天") {13 @Override14 public voidshowFeature() {15 System.out.println("秋高气爽,硕果累累。");16 }17 }, WINTER("冬天") {18 @Override19 public voidshowFeature() {20 System.out.println("寒冬腊月,冰天雪地。");21 }22 };23

24 String name;25

26 privateSeasonEnum(String name) {27 this.name =name;28 }29

30 public voidshowNam() {31 System.out.println(name);32 }33 }

抽象枚举类

抽象枚举类,就是在枚举类里定义一个抽象方法,让每个枚举类的实例分别去实现。

1 public enumSeasonEnum {2 SPRING("春天") {3 @Override4 public voidshowFeature() {5 System.out.println("春光明媚,鸟语花香。");6 }7 }, SUMMER("夏天") {8 @Override9 public voidshowFeature() {10 System.out.println("烈日炎炎,酷暑难耐。");11 }12 }, AUTUMN("秋天") {13 @Override14 public voidshowFeature() {15 System.out.println("秋高气爽,硕果累累。");16 }17 }, WINTER("冬天") {18 @Override19 public voidshowFeature() {20 System.out.println("寒冬腊月,冰天雪地。");21 }22 };23

24 String name;25

26 privateSeasonEnum(String name) {27 this.name =name;28 }29

30 public voidshowNam() {31 System.out.println(name);32 }33

34 public abstract voidshowFeature();35 }

Java为枚举类创建成员变量_Java学习——枚举类相关推荐

  1. java中定义类的关键字是_java中定义类的关键字是什么?

    java中定义类的关键字是:"class".在Java中定义一个类,需要使用"class"关键字.一个自定义的类名和一对表示程序体的大括号. 类是 Java 中 ...

  2. java枚举类与成员变量的关系_深入理解枚举类

    深入理解枚举 最近刚学习完JVM相关知识,想到枚举既然这么异类,那就从字节码角度来分析一下它.有关枚举的讲解,很多博客已经很详细了,这里我们就从字节码的角度重新来认识一下它. 枚举类是一种特殊的类,它 ...

  3. java实例变量成员变量_Java的类成员变量、实例变量、类变量,成员方法、实例方法、类方法...

    总是被这些相似的概念搞晕,查阅了资料后做个小总结,以变量为例,方法辨析类似. 1.多胞胎名字汇总辨析 成员变量和成员方法是范围最大的定义,提到成员变量就可以理解成你所定义在一个类体中的各类变量的统称, ...

  4. java实例成员和类成员变量_Java 中成员变量又分为 和类成员变量。_学小易找答案...

    [简答题]I'm not quite so poetic, but I do know that the subway is as essential to the character of New ...

  5. 如何理解Java的类变量、成员变量、常量、类属性、实例属性、字段(field)、成员方法、类方法

    文章目录 变量相关概念 变量/常量 类变量/静态变量 成员变量/实例变量 类属性/实例属性/对象属性 什么是 field 成员变量和类变量的区别 两个变量的生命周期不同 访问方式不同 数据存储位置不同 ...

  6. java面试题2 牛客:定义类中成员变量时不可能用到的修饰是

    懵逼树上懵逼果,懵逼树下你和我 第二题 定义类中成员变量时不可能用到的修饰是() A final B void C protected D static 一看到这道题,有点慌了,直接选c,很显然,我又 ...

  7. 重学Java(035)——Java基础知识(类作为成员变量、接口作为成员变量、接口作为方法参数和返回值类型)

    学习内容:三种引用类型用法 一.类作为成员变量 二.接口作为成员变量 三.接口作为方法参数和返回值类型 实际的开发中,引用类型的使用非常重要,也是非常普遍的.我们可以在理解基本类型的使用方式基础上,进 ...

  8. Java语言基础Day14(内部类、类作为成员变量类型、接口作为成员变量类型、接口作为方法的参数或返回值、红包案例、JDK9的JShell、编译器的两点优化)

    今日内容 一.内部类 1.内部类的概念与分类 2.成员内部类的定义 3.成员内部类的使用 4.内部类的同名变量访问 5.局部内部类定义 6.局部内部类的final问题 7.匿名内部类 匿名内部类定义格 ...

  9. java访问成员变量和方法_如何访问类的成员变量和方法

    如何访问类的成员变量和方法 在Java应用程序中,经常需要访问类的成员变量和方法,以实现程序的功能,请问应该如何访问类的成员变量和方法?在Java中通过类的实例(即对象)点(.)运算符来访问类的成员变 ...

最新文章

  1. JS中Node节点总结
  2. Jakarta Struts应用的七个经验
  3. 辨析ADKJVMJREJDKADT
  4. java线程池1001java线程池_深入浅出Java(Android )线程池ThreadPoolExecutor
  5. 小程序能打开html页面,小程序新功能直接打开网页
  6. sql isnull函数_SQL ISNULL函数
  7. ant之property关键字
  8. jsp el表达式无法正常显示解决方法
  9. MVC 中 Html.RenderPartial()与Html.Partial()区别
  10. 腾达W308r改64M内存8M闪存CPU加散热片,刷磊科NR235W/NR236W的软件
  11. ubuntu12.10 使用lync
  12. 计算机二级考试真题李阳答案,英语二级笔译_二级笔译培训_二级笔译真题 - 沪江英语...
  13. Microsoft Visual SourceSafe 2005 简体中文版
  14. NLP入门学习3——句法分析(基于LTP4)
  15. Kubernetes安装EFK日志收集
  16. 笔记本电脑怎么录音?电脑专业录音软件下载
  17. 图灵 数理逻辑 人工智能 图灵机与计算问题 论文
  18. 【硬刚大数据之面试篇】2021年从零到大数据专家面试篇之SparkSQL篇
  19. Linux 常用命令 — 修改密码
  20. 透视变换原理实例代码详解

热门文章

  1. 2020-2021 ICPC, NERC, Southern and Volga Russian Regional Contest A. LaIS
  2. ChatGPT 训练发图片
  3. 讲述是不是情人眼里真的出西施电影
  4. 风机永磁同步发电机模型
  5. Linux 软件包下载加速工具:APT Proxy
  6. 唯品会季报图解:营收245亿优于预期 Non-GAAP净利16亿
  7. Smartbi从交通工具演变看BI数据化运营历程
  8. DLL的进入退出——由DLL_PROCESS_ATTACH而联系搜索起来。
  9. 闹钟提醒,哪款备忘录便签软件可以用闹钟设置提醒?
  10. 排名函数row_number()、 rank()、 dense_rank()、ntile()、partition by的区别及具体用法示例