萤火小屋

优律的知识库

  • 首页
  • 归档
  • 分类
  • 标签
  • 留言
  • 关于

  • 搜索
消息队列 RabbitMQ Redis 双指针 力扣 动态代理 Git YAML SpringBoot SpringMVC 回溯算法 分治算法 归并排序 快排 手撕 事务 MySQL索引 MySQL 小技巧 Spring Framework Spring 动态规划 Linux Android 贪心算法 操作系统 进程调度模拟 IPv6 数据库 计算机组成原理 计算机基础 栈 Java 静态路由 路由器 交换机 数字通信 网络工程 计算机网络 Web http 大学学习技巧 程序设计 算法

Java的枚举(enum)

发表于 2021-06-29 | 分类于 Java SE | 0 | 阅读次数 190

Java枚举的原理

枚举其实就是一个类,这个类中所有的枚举都是这个类的实例,如下:

public enum SignalLight{
	RED(),
	GREEN(),
	YELLOW();
}

也可以把括号和分号去掉写成以下几种写法:

public enum SignalLight{
	RED,GREEN,YELLOW
}
public enum SignalLight{
	RED,GREEN,YELLOW;
}
public enum SignalLight{
	RED(),GREEN(),YELLOW()
}

在以上代码中,例如RED就是SignalLight这个类的实例,而且该类有且仅有RED、GREEN和YELLOW这三个实例。既然是类,就可以定义成员变量。

自定义Java枚举的成员变量和成员方法

当我们在实例的括号里填写参数时,Java就要求我们编写构造方法,且构造方法必须时私有的,注意:当枚举类中有除了实例列表以外的内容时就需要在实例列表最后一个后边加上分号,如下:

public enum SignalLight{
	GREEN("绿灯", "green"),
	RED("红灯", "red"),
	YELLOW("黄灯", "yellow");

	private Light(String chineseName, String englishName) {}
}

我们可以将从构造方法参数列表里传过来的值加以利用,于是我们可以在SignalLight类(枚举)中添加成员属性并在构造方法中为其赋值并为其编写get set方法。同时,枚举类中也可以重写toString方法,如下:

public enum SignalLight{
	GREEN("绿灯", "green"),
	RED("红灯", "red"),
	YELLOW("黄灯", "yellow");

	// 成员变量
	private String chineseName;
	private String englishName;

	// 构造器
	private Light(String chineseName, String englishName) {
		this.chineseName = chineseName;
		this.englishName = englishName;
	}

	// get set方法
	public String getChineseName() {
		return chineseName;
	}

	public void setChineseName(String chineseName) {
		this.chineseName = chineseName;
	}

	public String getEnglishName() {
		return englishName;
	}

	public void setEnglishName(String englishName) {
		this.englishName = englishName;
	}

	// 重写toString方法
	@Override
	public String toString() {
		return ordinal() + chineseName + englishName;
	}
}

这样一个简单完整的枚举类就写完了,下面我们看看如何使用它。

Java枚举的使用

在枚举中有几个常用的内置方法:

  1. name()方法:该方法返回枚举实例的名字,类型String
  2. ordinal()方法:该方法返回枚举实例的序号,类型int,从0开始。
  3. values()方法:该方法返回一个枚举实例数组。

下面演示一下使用方法:

public class Main {
	public static void main(String[] args) {
		
		SignalLight sl = SignalLight.GREEN;
		System.out.println("直接打印:" + sl);  // 直接打印——直接调用toString方法
		System.out.println("调用name()方法:" + sl.name());  // 调用name()方法
		System.out.println("调用ordinal()方法:" + sl.ordinal());  // 调用ordinal()方法
		System.out.println("通过当前实例可以获得枚举中的其他实例:" + sl.RED);  // 通过当前实例可以获得枚举中的其他实例
		
		SignalLight[] all = sl.values();  // 调用values()方法可以返回枚举数组 数组中包含所有该枚举的实例
		for (int i = 0; i < all.length; i++) {
			System.out.println("数组遍历:" + all[i]);
		}

		System.out.println(sl.getEnglishName() + " " + sl.getChineseName());
	}
}

控制台打印效果:

image.png

原理补充

枚举是类的一种,而且枚举类已经默认继承了java.lang.Enum<E>类,所以理论上枚举不可以再继承其他类,仅能实现接口。

# 程序设计 # Java
Java的集合类(容器)
Linux查看文本命令
  • 文章目录
  • 站点概览
优律

优律

优律的知识库

77 日志
20 分类
44 标签
E-mail Twitter Instagram
Links
  • CZLisyx - 浮生志
  • Vedfolnir
0%
© 2019 — 2023 萤火小屋——优律的博客网站
网站已勉强运行 
Halo博客系统技术支持