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)。

创建枚举类:

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

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

 public void test(SeasonEnum season) {
switch (season) {
case SPRING:
System.out.println("春天");
break;
case SUMMER:
System.out.println("夏天");
break;
case AUTUMN:
System.out.println("秋天");
break;
case WINTER:
System.out.println("冬天");
break;
default:
break;
}
}

获取枚举类所有实例

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

 public void test() {
SeasonEnum[] values = SeasonEnum.values();
for (SeasonEnum season : values) {
System.out.println(season);
}
}

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

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

成员变量

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

方法和构造器

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

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

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

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

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

 public enum SeasonEnum {
SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天") , WINTER("冬天"); String name; private SeasonEnum(String name) {
this.name = name;
} public void showNam() {
System.out.println(name);
}
}

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

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

实现接口的枚举类

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

定义一个接口:

 public interface Feature {
public void showFeature();
}

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

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

 public enum SeasonEnum implements Feature {
SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天") , WINTER("冬天"); String name; private SeasonEnum(String name) {
this.name = name;
} public void showNam() {
System.out.println(name);
} @Override
public void showFeature() {
System.out.println("一年四季,春夏秋冬。");
}
}

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

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

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

 public enum SeasonEnum implements Feature {
SPRING("春天") {
@Override
public void showFeature() {
System.out.println("春光明媚,鸟语花香。");
}
}, SUMMER("夏天") {
@Override
public void showFeature() {
System.out.println("烈日炎炎,酷暑难耐。");
}
}, AUTUMN("秋天") {
@Override
public void showFeature() {
System.out.println("秋高气爽,硕果累累。");
}
}, WINTER("冬天") {
@Override
public void showFeature() {
System.out.println("寒冬腊月,冰天雪地。");
}
}; String name; private SeasonEnum(String name) {
this.name = name;
} public void showNam() {
System.out.println(name);
}
}

抽象枚举类

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

 public enum SeasonEnum {
SPRING("春天") {
@Override
public void showFeature() {
System.out.println("春光明媚,鸟语花香。");
}
}, SUMMER("夏天") {
@Override
public void showFeature() {
System.out.println("烈日炎炎,酷暑难耐。");
}
}, AUTUMN("秋天") {
@Override
public void showFeature() {
System.out.println("秋高气爽,硕果累累。");
}
}, WINTER("冬天") {
@Override
public void showFeature() {
System.out.println("寒冬腊月,冰天雪地。");
}
}; String name; private SeasonEnum(String name) {
this.name = name;
} public void showNam() {
System.out.println(name);
} public abstract void showFeature();
}

Java学习——枚举类的更多相关文章

  1. Java学习-023-Properties 类 XML 配置文件读取及写入源代码

    之前的几篇 Properties 文章已经讲述过了 Java 配置文件类 Properties 的基本用法,查看 JDK 的帮助文档时,也可看到在 Properties 类中还有两个方法 loadFr ...

  2. Java学习——BigInteger类和BigDecimal类

    Java学习——BigInteger类和BigDecimal类 摘要:本文主要学习了用于大数字运算的BigInteger类和BigDecimal类. 部分内容来自以下博客: https://www.c ...

  3. Java学习——日期类

    Java学习——日期类 摘要:本文主要记录了Java开发中用到的和日期有关的类以及对日期的操作. 部分内容来自以下博客: https://www.cnblogs.com/talk/p/2680591. ...

  4. Java笔记---枚举类和注解

    Java笔记---枚举类和注解 一.枚举类 自定义枚举类 方式一:JDK5.0之前自定义枚举类 class Seasons { //1. 声明Seasons对象的属性 private final St ...

  5. Java学习--枚举

    枚举类型enum,地位等同于class,interface 使用enum定义的枚举类型,也是一种变量类型,可用于声明变量 枚举的一些特征 1.它不能有public的构造函数,这样做可以保证客户代码没有 ...

  6. 【Java】 枚举类

    如果要定义一个枚举类: public enum Size { SAMLL, MEDIUM, LARGE, EXTRA, EXTRA_LARGE}; 实际上,这个声明定义的类型是一个类,它刚好有4个实例 ...

  7. java中枚举类的实际应用

    知识点:在Java中,使用枚举类,当遇到实例类型有限的类时,并且数据库中用状态码代表一种含义时,如星期,性别,员工登陆某系统的状态等等, 可以考虑使用枚举类 本例子可以仿照,也可以使用自定义的类型处理 ...

  8. Java:枚举类也就这么回事

    目录 一.前言 二.源自一道面试题 三.枚举的由来 四.枚举的定义形式 五.Enum类里有啥? 1.唯一的构造器 2.重要的方法们 3.凭空出现的values()方法 六.反编译枚举类 七.枚举类实现 ...

  9. java基础---枚举类与注解

    一.枚举类 类的对象只有有限个,确定的.我们称此类为枚举类 如果枚举类中只有一个对象,则可以作为单例模式的实现方式. 定义枚举类 方式一:jdk5.0之前,自定义枚举类 public class Se ...

随机推荐

  1. RPM包安装——手动安装

    RPM包安装 手动安装 挂载光盘 首先查看光盘是否挂载(使用mount命令) RPM包存放位置 在你光盘挂载点的Packages目录下 使用 ll | grep 关键字 可以快速找到你想要的RPM包 ...

  2. CSS基本选择器是什么?基本选择器是如何工作

    基本选择器介绍 基本选择器又分为六种使用方式:如.通用选择器.标签选择器.类选择器.Id选择器.结合元素选择器.多类选择器. 基本选择器使用说明表. 选择器 语法格式 含义 举例 通用选择器 *{属性 ...

  3. 区块链社交APP协议分析预告

    2017年,比特币的火热,直接导致了代币市场的繁荣: 2018年,作为信用体系的未来解决方案,区块链引发了互联网原住民的淘金热. 作为风口上的引流神器,区块链技术与社交网络结合起来,产生了一系列区块链 ...

  4. linux用户管理-用户的基本操作

    目录 linux用户管理-用户的基本操作 用户相关的命令 linux用户管理-用户的基本操作 什么是用户 用户指能够正常登录linux或windows系统 区别 本质都是登录系统的,只不过Linux支 ...

  5. c++ 模板特化与局部特化

    c++ 模板特化与局部特化 模板的由来是要处理泛化,也就是任何类型都可以处理.但是泛化的同时,如果针对某种特殊的类型,又更加效率的处理方法.c++提供针对特殊的类型,可以定义不同的处理方法.针对某种特 ...

  6. Houdini设置

    关闭网络编辑器动画 Animate network changes 平移时保持视口枢轴 Maintain Viewport Pivot when Panning 通知帮助提示将出现在Houdini的状 ...

  7. 简述ECMAScript6新增特性

    1.变量 var 可以重复声明.只有函数级的作用域.存在变量提升 let 不能重复声明.有块级作用域.没有变量提升.变量 const 不能重复声明.具有块级作用域.常量 2.箭头函数 a.为了方便而存 ...

  8. Maven中使用tomcat:run出现错误org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException

    配置是正常的.查阅资料以后说是jdk版本什么的问题.多方修改没有任何改观.换一个思路去查询tomcat:run怎么运行. 是因为他还是沿用了上一次的tomcat插件(默认是6)所以运行的时候使用 to ...

  9. (day50)二、文件配置、ORM

    目录 一.静态文件 (一)配置html文件 (二)什么是静态文件 (三)静态文件配置 (四)静态文件动态绑定 (五)form表单POST请求配置 二.request方法初识 (一)request.me ...

  10. Unity Glossary

    https://docs.unity3d.com/2018.4/Documentation/Manual/Glossary.html 2D terms 2D Physics terms AI term ...