第八章:枚举

news2024/11/26 18:22:05

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、枚举
  • 总结


前言

类可以作为常量使用。


一、枚举

枚举是一组常量的集合。可以这里理解: 枚举属于一种特殊的类, 里面只包含一组有限的特定的对象。

枚举的实现方式
自定义类实现枚举
使用 enum 关键字实现枚举
枚举使用细则
不需要提供setXxx方法,因为枚举对象值通常为只读
对枚举对象/属性使用final + static 共同修饰,实现底层优化
枚举对象通常使用全部大写,常量的命名规范
枚举对象根须需要也可以有多个属性
自定义类实现枚举
1.构造器私有化
2.本类内部创建一组对象[四个 春夏秋冬]
3.对外暴露对象(通过为对象添加 public final static 修饰符)
4.可以提供 get 方法, 但是不要提供 set
public class Enumeration02 {
	public static void main(String[] args) {
		System.out.println(Season.AUTUMN);
		System.out.println(Season.SPRING);
	}
} 
//演示字定义枚举实现
class Season {//类
	private String name;
	private String desc;//描述

	//定义了四个对象, 固定.
	public static final Season SPRING = new Season("春天", "温暖");
	public static final Season WINTER = new Season("冬天", "寒冷");
	public static final Season AUTUMN = new Season("秋天", "凉爽");
	public static final Season SUMMER = new Season("夏天", "炎热");

	//1. 将构造器私有化,目的防止 直接 new
	//2. 去掉 setXxx 方法, 防止属性被修改
	//3. 在 Season 内部, 直接创建固定的对象
	//4. 优化, 可以加入 final 修饰符
	private Season(String name, String desc) {
		this.name = name;
		this.desc = desc;
	}
	
	public String getName() {
		return name;
	} 
	
	public String getDesc() {
		return desc;
	} 
	
	@Override
	public String toString() {
		return "Season{" +
		"name='" + name + '\'' +
		", desc='" + desc + '\'' +
		'}';
	}
	
}
enum 关键字实现枚举使用细则
1) 当我们使用 enum 关键字开发一个枚举类时, 默认会继承 Enum 类, 而且是一个 final 类[如何证明],老师使用 javap 工具来演示
2) 传统的 public static final Season2 SPRING = new Season2(“春天”, “温暖”); 简化成 SPRING(“春天”, “温暖”), 这里必须知道, 它调用的是哪个构造器.
3) 如果使用无参构造器 创建 枚举对象, 则实参列表和小括号都可以省略
4) 当有多个枚举对象时, 使用逗号间隔, 最后有一个分号结尾
5) 枚举对象必须放在枚举类的行首.
public class Enumeration03 {
	public static void main(String[] args) {
		System.out.println(Season2.AUTUMN);
		System.out.println(Season2.SUMMER);
	}
} 

//演示使用 enum 关键字来实现枚举类
enum Season2 {//类
	//定义了四个对象, 固定.
	// public static final Season SPRING = new Season("春天", "温暖");
	// public static final Season WINTER = new Season("冬天", "寒冷");
	// public static final Season AUTUMN = new Season("秋天", "凉爽");
	// public static final Season SUMMER = new Season("夏天", "炎热");
	//如果使用了 enum 来实现枚举类
	//1. 使用关键字 enum 替代 class
	//2. public static final Season SPRING = new Season("春天", "温暖") 直接使用
	// SPRING("春天", "温暖") 解读 常量名(实参列表)
	//3. 如果有多个常量(对象), 使用 ,号间隔即可
	//4. 如果使用 enum 来实现枚举, 要求将定义常量对象, 写在前面
	//5. 如果我们使用的是无参构造器, 创建常量对象, 则可以省略 ()
	SPRING("春天", "温暖"), WINTER("冬天", "寒冷"), AUTUMN("秋天", "凉爽"),
	SUMMER("夏天", "炎热"),//调用有参构造器
	WAHT()/WAHT;//调用无参构造器
	private String name;
	private String desc;//描述
	
	private Season2()//无参构造器
	{
	
	} 
	
	private Season2(String name, String desc) {
		this.name = name;
		this.desc = desc;
	}
	
	public String getName() {
		return name;
	} 
	
	public String getDesc() {
		return desc;
	} 
	
	@Override
	public String toString() {
		return "Season{" +
		"name='" + name + '\'' +
		", desc='" + desc + '\'' +
		'}';
	}
	
}


java编译与反编译
源文件编译成字节码文件:javac
字节码文件反编译成源文件:javap

在这里插入图片描述

使用关键字 enum 时, 会隐式继承 Enum 类, 这样我们就可以使用 Enum 类相关的方法。

public abstract class Enum<E extends Enum<E>>
	implements Comparable<E>, Serializable {
}
enum常用方法作用
toStringEnum类已经重写过了返回的是当前对象名,子类可以重写该方法, 用于返回对象的属性信息
name返回当前对象名(常量名) , 子类中不能重写
ordinal返回当前对象的位置号, 默认从 0 开始
values返回当前枚举类中所有的常量
valueOf将字符串转换成枚举对象, 要求字符串必须为已有的常量名, 否则报异常
compareTo比较两个枚举常量, 比较的就是编号,编号相减

public class EnumMethod {
	public static void main(String[] args) {
	
		//使用 Season2 枚举类, 来演示各种方法
		Season2 autumn = Season2.AUTUMN;
		
		//输出枚举对象的名字
		System.out.println(autumn.name());
		
		//ordinal() 输出的是该枚举对象的次序/编号, 从 0 开始编号
		//AUTUMN 枚举对象是第三个, 因此输出 2
		System.out.println(autumn.ordinal());
		
		//从反编译可以看出 values 方法, 返回 Season2[]
		//含有定义的所有枚举对象
		Season2[] values = Season2.values();
		System.out.println("===遍历取出枚举对象(增强 for)====");
		for (Season2 season: values) {//增强 for 循环
			System.out.println(season);
		} 
		
		//valueOf:将字符串转换成枚举对象, 要求字符串必须为已有的常量名, 否则报异常
		//执行流程
		//1. 根据你输入的 "AUTUMN" 到 Season2 的枚举对象去查找
		//2. 如果找到了, 就返回, 如果没有找到, 就报错
		Season2 autumn1 = Season2.valueOf("AUTUMN");
		System.out.println("autumn1=" + autumn1);
		System.out.println(autumn == autumn1);
		
		//compareTo: 比较两个枚举常量, 比较的就是编号
		//老韩解读
		//1. 就是把 Season2.AUTUMN 枚举对象的编号 和 Season2.SUMMER 枚举对象的编号比较
		//2. 看看结果
		/*
		public final int compareTo(E o) {
			return self.ordinal - other.ordinal;
		} 
		Season2.AUTUMN 的编号[2] - Season2.SUMMER 的编号[3]
		*/
		
		System.out.println(Season2.AUTUMN.compareTo(Season2.SUMMER));


		
		//普通的 for 循环
		// System.out.println("=====普通的 for=====");
		// for (int i = 0; i < nums.length; i++) {
		// 		System.out.println(nums[i]);
		// }
		//增强的 for 循环
		
		// System.out.println("=====增强的 for=====");
		// //执行流程是 依次从 nums 数组中取出数据, 赋给 i, 如果取出完毕, 则退出 for
		// for(int i : nums) {
		// 		System.out.println("i=" + i);
		// }
		
	}
}
enum实现接口
使用 enum 关键字后, 就不能再继承其它类了, 因为 enum 会隐式继承 Enum, 而 Java 是单继承机制
枚举类和普通类一样, 可以实现接口

enum 类名 implements 接口 1, 接口 2{}

public class EnumDetail {

	public static void main(String[] args) {
		Music.CLASSICMUSIC.playing();
	}
} 
class A 
{
	
} 
//1.使用 enum 关键字后, 就不能再继承其它类了, 因为 enum 会隐式继承 Enum, 而 Java 是单继承机制
//enum Season3 extends A {
//
//}
//2.enum 实现的枚举类, 仍然是一个类, 所以还是可以实现接口的.

interface IPlaying {
	public void playing();
} 

enum Music implements IPlaying {
	CLASSICMUSIC;
	
	@Override
	public void playing() {
		System.out.println("播放好听的音乐...");
	}
}

总结

枚举对象就是类作为常量的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1213431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 分库分表与 TiDB(平凯数据库),如何选择?

随着互联网行业的飞速发展&#xff0c;数据量不断增长&#xff0c;传统的关系型数据库已经无法满足大规模数据处理的需求。为了解决这一问题&#xff0c;分库分表和分布式数据库应运而生。本文将对比分析 MySQL 分库分表和 TiDB 这两种解决方案&#xff0c;帮助大家更好地选择适…

自动化测试和手工测试有什么不同以及自动化测试和手工测试应用范围的对比

一、初识自动化测试 如果以前没有做过自动化测试&#xff0c;那么就不了解自动化测试&#xff0c;可能会觉得自动化测试比较神秘&#xff0c;但是&#xff0c;我们在日常的计算机操作中&#xff0c;可能会碰到一些自动化处理的过程&#xff0c;这些过程和自动化测试比较接近。 …

Mysql修改事务隔离级别及与spring隔离级别关系

Mysql如何修改事务隔离级别 1.查询事务级别 1.1查询全局事务隔离级别 select global.tx_isolation; 1.2 查询当前会话事务隔离级别 select session.tx_isolation; 2.修改事务隔离级别 2.1 修改全局事务隔离级别 set global transaction isolation level read committed;…

Kafka 的应用场景

Kafka 是一个开源的分布式流式平台&#xff0c;它可以处理大量的实时数据&#xff0c;并提供高吞吐量&#xff0c;低延迟&#xff0c;高可靠性和高可扩展性。 Kafka 最初是为分布式系统中海量日志处理而设计的。它可以通过持久化功能将消息保存到磁盘&#xff0c;并让消费者按…

景联文科技入选量子位智库《中国AIGC数据标注产业全景报告》数据标注行业代表机构TOP20

量子位智库《中国AIGC数据标注产业全景报告》中指出&#xff0c;数据标注处于重新洗牌时期&#xff0c;更高质量、专业化的数据标注成为刚需。未来五年&#xff0c;国内AI基础数据服务将达到百亿规模&#xff0c;年复合增长率在27%左右。 基于数据基础设施建设、大模型/AI技术理…

areca backup备份工具安装与使用

由于FTP数据备份执行&#xff0c;需要人工操作执行&#xff0c;不满足业务需求&#xff0c;发现此工具结合ftp联动可以定时任务进行备份 获取地址 https://nchc.dl.sourceforge.net/project/areca/areca-stable/areca-7.5/areca-7.5-windows-jre64-setup.exe 前提条件 注意…

关闭RecyclerView惯性滚动,以及多个RecyclerView在嵌套滚动中的注意事项

前言&#xff1a; 当前RecyclerView 下拉到顶部 或者 上拉到底部时&#xff0c;虽然滚动列表停止了&#xff0c;但惯性任务并没有结束&#xff0c;一些特殊需求可能受到影响&#xff0c;需要手动停止。 1. RecyclerView源码 调用 rv.stopScroll() 停止&#xff1b; 2. Recycl…

数据库sql语句设置外键

当我们需要在数据库表之间建立关联关系时&#xff0c;可以使用外键&#xff08;Foreign Key&#xff09;来实现。在 SQL 中&#xff0c;外键可以用来保持数据的完整性&#xff0c;并帮助我们更有效地管理数据。以下是设置外键的步骤&#xff1a; 1.在创建表时&#xff0c;需要…

公益SRC实战|SQL注入漏洞攻略

目录 一、信息收集 二、实战演示 三、使用sqlmap进行验证 四、总结 一、信息收集 1.查找带有ID传参的网站&#xff08;可以查找sql注入漏洞&#xff09; inurl:asp idxx 2.查找网站后台&#xff08;多数有登陆框&#xff0c;可以查找弱口令&#xff0c;暴力破解等漏洞&…

7个免费的优质图标素材网站,设计师必备!

对于交互设计师和产品经理来说&#xff0c;一套漂亮易用的图标可以算是提高效率的法宝&#xff0c;自己导出一套标准化的图标是一个巨大的工程。如何找到一个既美观又实用又能快速重用的图标&#xff1f;别慌&#xff0c;今天我们整理了7个价值高又好用的图标素材网站&#xff…

wx.canvasToTempFilePath生成图片保存到相册

微信小程序保存当前画布指定区域的内容导出生成指定大小的图片&#xff0c;记录一下 api&#xff1a;wx.canvasToTempFilePath 效果&#xff1a; 代码&#xff1a;wxml <canvas style"width: {{screenWidth}}px; height: {{canvasHeight}}px;" canvas-id"my…

芯科科技推出新的8位MCU系列产品,扩展其强大的MCU平台

新的BB5系列为简单应用提供更多开发选择 中国&#xff0c;北京 - 2023年11月14日 – 致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;&#xff0c;今日宣布…

浅析SVPWM调制技术

目录 收起 目录 目录 一、SVPWM基本原理 1.从三相电机运行原理到SVPWM调制技术 2.SVPWM调制的实现方法 3.合成参考电压矢量的方法 &#xff08;abc->αβ坐标变换&#xff09; 4.基本电压矢量时间的分配 5.基本电压矢量顺序的分配 6.扇区判断 二、仿真验证 1.操…

什么是美颜SDK?美颜SDK对比评测

美颜SDK在视频直播中发挥着越来越重要的作用。为了实现实时、高质量的美颜效果&#xff0c;各种视频直播美颜SDK应运而生。本文将对这些技术进行深入解析与比较。 一、技术原理解析 深度学习技术通过大量的训练数据学习人脸特征&#xff0c;从而实现更为自然的美颜效果。传统…

PowerPoint技巧:如何将一张图片同时加到全部幻灯片里?

想把一张图片加到PPT每一张幻灯片的同一个位置&#xff0c;如果一张一张的添加就太耗时间了&#xff0c;一起来看看如何利用母版快速设置同时添加吧。 首先&#xff0c;打开需要编辑的PPT&#xff0c;在菜单栏依次点击【视图】→【幻灯片母版】&#xff1b; 打开母版后&#x…

2023年【安全员-C证】考试题库及安全员-C证考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-C证考试题库根据新安全员-C证考试大纲要求&#xff0c;安全生产模拟考试一点通将安全员-C证模拟考试试题进行汇编&#xff0c;组成一套安全员-C证全真模拟考试试题&#xff0c;学员可通过安全员-C证考试总结全…

【App测试】adb三大连接方式-夜神模拟器+真机+android真机(详细步骤)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 adb连接安卓模拟器…

AD教程 (十五)利用IPC封装创建向导快速创建封装

AD教程 &#xff08;十五&#xff09;利用IPC封装创建向导快速创建封装 安装IPC封装向导 点击头像&#xff0c;选择Extensions and Updates&#xff0c;扩展更新确保已经安装了IPC Footprint Generator IPC封装创建向导 打开IPC封装创建向导 进入PCB封装界面&#xff0c;点击…

split loop

// refactoringmotherfucker.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> #include <vector> #include <memory>// before refactoring of split loop class People { public:People(double _age,double _…

day17_多线程基础

今日内容 零、 复习昨日 一、作业 二、进程与线程 三、创建线程 四、线程的API 一、复习 IO流的分类 方向: 输入,输出类型: 字节(XxxStream),字符(XxxReader,XxxWriter)字节输入流类名: FileInputStream字节输出流类名: FileOutputStream字符输入流类名: FileReader字符输出流类…