JavaSE——面向对象高级三(3/5)-枚举(认识枚举、拓展:抽象枚举、用枚举实现单例模式、枚举的应用场景)

目录

枚举的概述

认识枚举

拓展:抽象枚举

用枚举实现单例模式

枚举的应用场景


枚举的概述

认识枚举

  • 枚举是一种特殊类。

枚举类的格式

修饰符 enum 枚举类名{

        名称1,名称2,...;

        其他成员...

}

public enum A{X,Y,Z;...
}

 注意

  • 枚举类中的第一行,只能写一些合法的标识符(名称),多个名称用逗号隔开。
  • 这些名称,本质是常量,每个常量都会记住枚举类的一个对象

枚举类的特点

public enum A{X,Y,Z;
}

实际上完整代码为: 

Complied from "A.java"
public final class A extends java.lang.Enum<A>{public static final A X = new A();public static final A Y = new A();public static final A Z = new A();
}

具有以下特点:

  • 枚举类的第一行只能罗列一些名称,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象
  • 枚举类的构造器都是私有的(写不写都只能是私有的),因此,枚举类对外不能创建对象。
  • 枚举都是最终类,不可以被继承。
  • 枚举类中,从第二行开始,可以定义类的其他各种成员。
  • 编译器为枚举类新增了几个方法,并且枚举类都是继承:java.lang.Enum类的,从enum类也会继承到一些方法。

 第一点:枚举类的第一行都是常量,记住的是枚举类的对象

A a = A.Y;

因为枚举类的第一行都是常量,记住的是枚举类的对象,所以我们可以直接用枚举类得到里面的象,例如:枚举类名称.枚举类常量1、枚举类名称.枚举类常量2;A.X、A.Y

 第二点:枚举类的构造器是私有的,不能对外创建对象。

public class Test{public static void main(String[] args){A a = new A(); //会报错//枚举类不能对外创建对象}
}

第三点:枚举类提供了一些额外的API

A[] a1 = A.values(); //拿到全部对象
A a2 = A.valueOf("Z"); //拿到其中一个对象
System.out.println(a2.name()); //输出结果为Z对象的name
System.out.println(a2.ordinal()); //索引

都是为枚举类新增的一些API。

拓展:抽象枚举

抽象枚举简单来说,就是枚举类里面定义了抽象方法的枚举类。

抽象枚举在创建自身的对象时,必须要重写方法,所以直接在第一行中进行方法重写:

public enum B{X(){@Overridepublic void go(){}},Y(){@Overridepublic void go(){}};private String name; //第一行之后就可以正常写变量了public abstract void go(); //抽象方法public String getName(){return name;}public String setName(name){this.name = name;}
}

写构造器时,可以不用写修饰符,默认为private。

public enum B{X(){@Overridepublic void go(){}},Y(){@Overridepublic void go(){}};/* private */ B(){}/* private */ B(String name){this.name;}private String name; public abstract void go(); //抽象方法public String getName(){return name;}public String setName(name){this.name = name;}
}

如果把无参构造器去掉,就会报错,因为前面枚举类创建的对象重写方法时要调用到无参构造器。

当然,也可以调用有参构造器

public enum B{X(){@Overridepublic void go(){}},Y("张三"){@Overridepublic void go(){System.out.println(getName() + "在跑~");}};B(){}B(String name){this.name;}private String name; public abstract void go(); //抽象方法public String getName(){return name;}public String setName(name){this.name = name;}
}
public class Test{public static void main(String[] args){B y = B.Y;y.go();}
}

运行结果为:

张三在跑~

这个过程是:Y对象在用B枚举类创建自己这个对象,调用B的有参构造器,传入参数“张三”,存储在name变量中;且因为是抽象枚举,创建Y对象时需要重写其所有抽象方法,重写go方法时取到name变量的值“张三”并输出。

用枚举实现单例模式

使用枚举是可以直接实现单例模式的,

复习一下单例设计模式:

        一个类可以new出很多对象,但对于某个应用场景下,我们希望这个类只能有一个对象这就是单例设计模式所解决的问题。也就是说,单例设计模式是确保一个类只有一个对象,我们学过饿汉式单例和懒汉式单例,前者是先把对象创建好,后者则在使用该设计模式时再进行创建。

        写法:

  • 把类的构造器私有。
  • 定义一个类变量记住类的一个对象。·
  • 定义一个类方法,返回对象。

 用枚举类的方式实现单例:

public enum C{X; //单例
}

枚举的应用场景

  • 用来表示一组信息,然后作为参数进行传输。

(可以类比C语言的枚举类型变量)

如果选择定义一个一个的常量来表示一组信息,并作为参数传输,那么其参数值不受约束

而选择定义枚举表示一组信息,并作为参数传输,代码可读性好,参数值得到了约束,对使用者更友好

例如:

public class Constant{public static final int BOY = 0;public static final int GIRL = 1;
}public class Test{public static void main(String[] args){//check(1);//check(21);  //传入参数不受约束check(Constant.BOY);}public static void check(int sex){switch(sez){case Constant.BOY:...break;case Constant.GIRL:...break;}}
}

如果用常量做信息标志和分类,就存在传入参数不受约束的问题。

所以就开始用枚举了:

public enum Constant2{BOY,GIRL;  //定义枚举类型
}public class Test{public static void main(String[] args){//check(1);//check(21);  //传入参数不受约束check(Constant2.BOY);}public static void check(Constant2 sex){switch(sez){case BOY: //Constant.BOY前缀可以省略...break;case GIRL:...break;}}
}

虽然枚举做信息标志和分类比较好,但是在实际中可能会发现还是很多人用常量,主要是因为常量用起来比较简单,其他原因就是常量也有一些优势,比如可以定义不同类型的常量,使用起来比较灵活。

所以两种方式都会使用到,并没有相互淘汰掉谁。


END


学习自:黑马程序员——JavaSE课程

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

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

相关文章

[晕事]今天做了件晕事29;iptables

今天办了一件晕事&#xff0c;主机之间做ping用tcpdump抓到了ping request&#xff0c;但是没有看到ping reply&#xff0c;查看主机的arp表&#xff0c;路由表都没有问题&#xff0c;忘记看iptables的规则。虽然在tcpdump看到包&#xff0c;只是代表包到了二层&#xff0c;并不…

C++:变量和常量(3)

变量 什么是变量&#xff1a;变量就是一个装东西的盒子 通俗&#xff1a;变量是用于存放数据的容器。我们通过变量名获取数据&#xff0c;甚至数据可以修改 变量的作用&#xff1a;给指定的内存空间起名&#xff0c;后期通过起的名字就可以调用整个内存空间 定义变量的格式 &a…

AXI Memory Mapped to PCI Express 学习笔记(四)——仿真设计

本文包含有关Vivado Design Suite中对AXI Memory Mapped to PCI Express core进行仿真的示例设计信息。 一、仿真设计概述 在仿真设计中&#xff0c;事务是从Root Port模型发送到配置为Endpoint的AXI Memory Mapped to PCI Express core&#xff0c;并在AXI块RAM控制器设计中…

基于模糊控制算法的倒立摆控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 对倒立摆模型进行模糊控制器simulink建模&#xff0c;利用倒立摆的摆角角度与小车的位置来控制小车的推力&#xff0c;控制了倒立摆的摆角问题&#xff0c;使得小车最终停在稳…

前端面试,笔试题

$refs的优点以及弊端 $refs的弊端是&#xff0c;状态管理比较混乱&#xff0c;不利于维护 异步组件和路由懒加载区别 异步组件&#xff1a;异步组件是一种技术&#xff0c;它允许在页面需要时才从服务器加载相应的组件。这种方式适用于大型应用&#xff0c;可以将应用分割成小…

如何在服务器上传/下载文件

从服务器下载文件到本地 打开xshell&#xff0c;输入&#xff1a;ssh root159.xxx.xxx.xx 然后需要输入密码 cd到目录文件夹下 cd /enmotech apt install zip zip -r uploads.zip uploads apt install lrzsz sz uploads.zip 从本地上传文件到服务器 如果文件是放在E盘…

SpringBoot实现RabbitMQ的WorkQueue(SpringAMQP 实现WorkQueue)

文章目录 1. 前言2. 思路3. 消息发送4. 消息接收4.1 能者多劳 总结 1. 前言 上一篇文章,实现了用 SpringBoot实现RabbitMQ的简单队列, 篇文章 操作 用SpringBoot实现RabbitMQ的WorkQueue(SpringAMQP 实现WorkQueue) Work queues&#xff0c;也被称为&#xff08;Task queues&…

Python Flask-Mail实现邮件发送

一、邮件发送的扩展 关于如何找到flask发送邮件的插件&#xff1f;&#xff0c;上一篇已经分享了如何找到第三方插件&#xff0c;也找到了插件flask-mail的使用文档&#xff0c;那我们就来实战吧 二、根据文档&#xff0c;总结发送邮件的流程 从文档中可以总结出发送邮件的步…

springboot-vue前后端分离项目实例

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【C语言】Infiniband驱动pci_pcie_cap

一、注释 //include\linux\compat-2.6.h #define LINUX_BACKPORT(__sym) backport_ ##__sym//include\linux\compat-2.6.33.h #define pci_pcie_cap LINUX_BACKPORT(pci_pcie_cap)/*** pci_pcie_cap - 获取保存的PCIe能力偏移* dev: PCI 设备** PCIe能力偏移在PCI设备初始化时…

实例、构造函数、原型、原型对象、prototype、__proto__、原型链……

学习原型链和原型对象&#xff0c;不需要说太多话&#xff0c;只需要给你看看几张图&#xff0c;你自然就懂了。 prototype 表示原型对象__proto__ 表示原型 实例、构造函数和原型对象 以 error 举例 图中的 error 表示 axios 抛出的一个错误对象&#xff08;实例&#xff0…

基于springboot的车辆充电桩管理系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

【Postman如何进行接口测试简单详细操作实例】

1、下载Postman postman下载地址&#xff1a;Download Postman | Get Started for Free 2、安装Postman (1)双击下载好的postman-setup.exe文件&#xff0c;进行安装postman工具 (2)安装完成后&#xff0c;在桌面找到并打开postman软件&#xff0c;输入邮箱和密码进行登录&a…

【前端面试3+1】03深拷贝浅拷贝、let和var、css盒模型、【有效括号】

一、深拷贝浅拷贝 深拷贝和浅拷贝都是用于复制对象或数组的概念&#xff0c;但它们之间有着重要的区别&#xff1a; 1. 浅拷贝&#xff1a; 浅拷贝是指在拷贝对象或数组时&#xff0c;只会复制一层对象的属性或元素&#xff0c;而不会递归地复制嵌套的对象或数组。因此&#xf…

使用jQuery的基本方法

1.jQuery基本选择器有哪些&#xff0c;语法 jQuery(选择器).action()元素选择器 $(p);iD选择器 $("#myElement")类选择器 $(".myClass") 属性选择器 $(a[href^"https://"]2.如何操作类属性 //添加类名 a.classList.add("类1", &…

只用一部手机,为你的吉利车机安装第三方软件(支持大部分车型)

&#x1f4a1; 文中使用的方法为DNS重定向&#xff0c;需要你具备一定的动手能力&#xff0c;否则将无法达到最终目的。 &#x1f4a1; 阅读本文&#xff0c;视为你有一定电脑基础&#xff0c;难以理解时&#xff0c;请寻求百度帮助&#xff0c;百度就是最好的老师&#xff01;…

java实现MP4视频压缩

要在Java中实现MP4视频压缩,您可以使用一些第三方库,比如ffmpeg或Xuggler等。下面是使用ffmpeg库进行MP4视频压缩的示例代码: java import java.io.BufferedReader; import java.io.InputStreamReader; public class MP4Compressor { public static void main(String[] args)…

Redis命令-String命令

4.3 Redis命令-String命令 String类型&#xff0c;也就是字符串类型&#xff0c;是Redis中最简单的存储类型。 其value是字符串&#xff0c;不过根据字符串的格式不同&#xff0c;又可以分为3类&#xff1a; string&#xff1a;普通字符串int&#xff1a;整数类型&#xff0…

【Python操作基础】——序列

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

小米HyperOS 澎湃os机型免答题 免社区等级 秒接bl锁操作步骤解析

小米机型解锁bl 绕过社区等级5才可以解锁的限制的教程_没有五级社区怎么解锁bl-CSDN博客 上次解析了小米有些出厂不是HyperOS系统的机型绕社区等级接bl锁的操作。目前有更新出厂为HyperOS系统的机型免社区登录等级限制 免答题解锁bl的操作。而且有网友在米14 平板6sp k70这些新…