一、 初识java枚举类型
枚举类型enum是指由一组固定的常量组成合法值的类型。例如一周七天、一年四季,java的枚举是在jdk1.5中引入的,在那之前多采用一种叫int枚举模式的方式实现。
Int 枚举模式
public class Season {
public static final int SPRING = 1;
public static final int SUMMER = 2;
public static final int AUTUMN = 3;
public static final int WINTER = 4;
}
Java枚举类型
public enum Season {
SPRING,SUMMER,AUTUMN,WINTER
}
枚举类型相vs. int模式
1、 枚举类型提供编译时期类型安全。
2、 枚举类型对于提供了很多有用的方法,例如静态方法values()获取所有实例的数组,valueof(…)可以通过实例的名称获取对应的实例。
二、 枚举的特点
枚举没有可访问的构造器(private或者包访问级别),不能创建实例,只能使用声明过得枚举常量。
三、 枚举的底层实现
我们可以通过enum{}新建一个枚举类型,那么底层是如何支持这种类型的呢?实际上创建enum时,编译器会为你生成一个继承自java.lang.Enum的类,它实现了Comparable和Serializable接口,必然也继承自Object,因此,你可以将enum当做是一个普通的类来使用,使用继承自Object 、Comparable和Serializable的方法,添加自己的字段和方法,也可以实现其它接口,不过由于java的单根结构,不能在继承自其它的基类。
PS:向enum中添加方法,需要在最后一个enum实例后添加分号。
来看一下java.lang.Enum
的提供的方法,出了从父类接口继承过来的方法外,还有三个自己的方法。
name()
|
返回你声明的枚举实例的名字,比如上面的SPRING,对应的name就是”SPRING”.
|
ordinal()
|
返回枚举实例在声明中的序号,严格按照声明的顺序,不过操作枚举实例时,最好不要依赖于ordinal。说不定哪天你改了声明的顺序,却忘记改对应的操作,会造成不必要的麻烦。
|
valueOf
|
这是Enum的静态方法,通过枚举的Class类型和枚举实例的name返回枚举实例。
|
因为enum天生就具备整数值的次序,你可以通过ordinal()获取,switch可以使用enum。
枚举类型的values()方法
所有的枚举类型都是java.lang.Enum的子类,你可以这样赋值Enum<Season> autumn = Season.AUTUMN; 但是枚举类型拥有的values()方法Enum中却没有,那这个方法是哪来的呢。values()方法是由编译器插入到enum定义中的static方法。
values()的作用是获取枚举实例的集合,那如果是Enum<Season> autumn,这样声明的又如何获取枚举实例的集合呢。Class<?>提供了getEnumConstants()方法获取枚举实例的数组
,当Class的类型不是enum时返回null。
四、 使用枚举
考虑这样一个需求,从控制台接收一个字符串表示星期几,然后根据这个参数输出当天的工作性质(工作日or周末),或者是输出当天的心情。怎么做呢?
方法一
if-else 或者switch。这显然是最笨拙,可扩展性最差的一种实现方式了。
方法二
实现一个继承结构,表示各个星期,然后在父类中实现一个静态工厂方法,根据输入的参数返回星期N的实例。在学会使用枚举前,我基本上都会选择这么做。
方法三
使用枚举。
public enum Week {
Sunday(Work.Weekend) {
@Override
public void mood() {
System.out.println("为什么假期不能长点呢?!");
}
},Monday(Work.Weekday) {
@Override
public void mood() {
System.out.println("好困呀,假期综合症");
}
},TuesdayMonday(Work.Weekday) {
@Override
public void mood() {
System.out.println("奋斗ing");
}
},WednsdayMonday(Work.Weekday) {
@Override
public void mood() {
System.out.println("奋斗ing");
}
},ThursdayMonday(Work.Weekday) {
@Override
public void mood() {
System.out.println("为什么明天才是周五?");
}
},FridayMonday(Work.Weekday) {
@Override
public void mood() {
System.out.println("好期待呀,就要放假了");
}
},Saturday(Work.Weekend) {
@Override
public void mood() {
System.out.println("放假就是爽啊就是爽啊");
}
};
//与常量相关的数据
private Work work;
private Week(Work work){
this.work = work;
}
//在枚举中添加方法
public boolean needWork(){
return this.work.needWork;
}
//在枚举中添加abstract方法,也可以单独实现一个接口。
public abstract void mood();
enum Work{
Weekday(true),Weekend(false);
private Work(boolean needWork){
this.needWork = needWork;
}
private boolean needWork;
}
}
分享到:
相关推荐
### Java枚举类型详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种重要的数据类型,在程序设计中扮演着不可或缺的角色。本文将深入探讨Java枚举类型的特性和用法,并通过具体实例说明其优势所在。枚举...
### JAVA中的枚举类型2:高级特性 #### 概述 枚举类型是Java语言中一个非常实用且灵活的功能。通常情况下,我们将其用于表示一组固定的常量集合,如一周中的几天、颜色选项等。然而,Java中的枚举类型远不止于此。...
在这个结构中,`EnumName` 是枚举类型的名称,`CONSTANT1, CONSTANT2, ..., CONSTANTN` 是枚举类型的常量。每个常量都是一个对象,它们自动继承自 `java.lang.Enum` 类,并且可以拥有自己的方法和属性。 例如,定义...
Java 基础知识点总览 - 枚举和注解 Java 中的枚举(enumeration)是一种特殊的数据类型,它可以表示有限的、固定的常量集。枚举类是一种特殊的类,它的对象是有限的、固定的和不可变的。 枚举的定义 在 Java 中,...
在Java中,枚举类型本质上是一个`final`类,自动继承`Enum`类,并且每个枚举常量都是该类的一个实例。编译器还会自动为枚举类型添加一些默认的方法,如`values()`和`valueOf()`等。 #### 七、枚举与接口 在某些...
枚举类型不仅限于整数,还可以自定义它们的基础类型,如`byte`、`int`、`long`等,并可以为每个成员指定特定的值: ```csharp public enum Color : byte { Red = 1, Green = 2, Blue = 3 } ``` 在输入输出(Input/...
12. **枚举和注解**:理解枚举类型的作用和用法,以及注解在代码中的功能,如用于元数据、编译时和运行时处理。 13. **异常处理**:了解异常分类,学习如何编写try-catch-finally语句,以及如何自定义异常。 通过...
枚举Java基础知识点 Java中的枚举(Enumeration)是一种特殊的数据类型,它可以将一组固定的常量分组到一个枚举类型中,使得代码更加简洁、易读和维护。枚举的用法非常广泛,在Java中有多种使用方式,我们将逐一...
12. **枚举类型**:Java 5引入了枚举,用于定义一组固定的常量。 13. **泛型**:泛型允许在类、接口和方法中使用类型参数,增强了代码的类型安全性和重用性。 14. **Java SE (标准版)**:"老王java se"可能是指...
《Java基础案例教程(第2版)》是一本旨在教授初学者Java编程基础知识的教材,其教学设计旨在通过实例引导学生深入理解Java语言的核心概念。本教程覆盖了从环境搭建到程序设计的各个环节,旨在帮助学生建立起坚实的...
13. **枚举(Enum)**:枚举类型提供了一种安全的方式来表示固定集合中的值。 14. **泛型(Generics)**:泛型用于提高代码的类型安全,允许在类、接口和方法中使用类型参数。 15. **多线程(Multithreading)**:...
这份“Java基础教程PPT”是为初学者设计的,旨在帮助他们掌握Java编程的基础概念和技能。 首先,PPT可能会从Java的历史和特性开始讲解。Java由James Gosling在1995年推出,目标是“一次编写,到处运行”。它的主要...
【Java基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。Java以其“一次编写,到处运行”的特性,成为跨平台应用开发的首选语言。Java的基础部分主要包括...
使用场景及目标:本文旨在提升读者对于Java中枚举和泛型的理解与应用能力,包括掌握如何高效地定义和使用枚举类型,理解并实现泛型程序设计的技巧,从而写出更为强大、灵活的代码。 其他说明:阅读本篇文章需要具备...
学习Java的基础语法,你需要掌握变量、数据类型、运算符、控制结构(如if语句、for循环、while循环)、方法定义与调用、数组等基本元素。此外,还需了解异常处理、包的使用、输入输出流等高级概念。编写Java代码通常...
"Java基础案例教程"是为初学者设计的教育资源,旨在帮助他们掌握Java编程的基础概念和实践技能。本教程出自知名教育机构黑马程序员,该机构以其深入浅出的教学方式和实用的案例著称。 在本教程中,你将学习到以下...
这份"Java基础ppt.zip"压缩包提供了一套完整的Java基础知识学习资源,专为初学者设计,旨在帮助那些对IT行业感兴趣的新手从零开始系统地掌握Java编程。 PPT中可能会涵盖以下关键知识点: 1. **Java简介**:解释...
这份"JAVA基础PPT下载"提供了一套基础的Java学习资源,适用于初学者,旨在引导新手进入Java的世界。以下是对这份教程可能包含的一些核心知识点的详细阐述: 1. **Java概述**:首先会介绍Java的历史背景,它的创始人...
Java是一种广泛使用的面向对象编程语言...综上所述,理解Java的基本数据类型、数组和枚举类型是编写高效、可靠的面向对象程序的基础。通过熟练掌握这些概念,开发者可以更好地组织和管理程序的数据,并实现复杂的功能。