进阶JAVA篇-深入了解枚举与抽象枚举

news2024/11/16 15:47:03

目录

      介绍一下枚举:

          1.1枚举的概念

          1.2具体如何来使用呢?

          1.3对枚举小结

          1.4抽象枚举概念

          1.5对抽象枚举小结


                介绍一下枚举:

        1.1枚举的概念

        在JAVA中,枚举是一种特殊的类,用于定义一组常量。Java中的枚举类型是通过使用关键字"enum"来定义的。枚举类中的第一行只能写一些合法的标识符(名称),多个名称需要逗号相隔开来,这些名称本质是常量,每个常量都会记住一个枚举类的对象。枚举类里面除了第一行的常量之外,其余跟一般的类所具有的成员(变量、方法、构造器、代码块、内部类)都有具有。

代码如下:

public class Text {
    public static void main(String[] args) {

    }

}

enum EnumerateClasses{
    X,Y,Z;

    private String name;
    private int age;

    public void fun(){
        System.out.println("调用枚举类中的方法");
    }

    EnumerateClasses() {
    }

    EnumerateClasses(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

         接下来我们反汇编来观察枚举类,深入枚举内部了解一下:

        

        先来看第一个“红框”用关键字final来修饰一个枚举类,所以枚举类是不可以被别的类所继承的,枚举类是最终类。再来看第二个“大红框”,编写的第一行的符号(名称),之所以被称为常量,这样就一清二楚了,是因为用static final 来修饰所编写的名称,还有一个要注意的是,这些名称的类型是一个类!!!因此可以这样说枚举类的第一行必须罗列的是枚举对象的名称。

        还有一点注意,通过反汇编观察到,枚举类中无论是无参构造器还是有参构造器中都默认为私有的(private)来修饰构造器,所以枚举是不可以在枚举外部new创建对象的,只能在内部。其实枚举就是一个只能在自己内部定义自己的对象。

如下:

         1.2具体如何来使用呢?

代码如下:

public class Enum {
    public static void main(String[] args) {
        EnumerateClasses enumerateClasses = EnumerateClasses.X;
        enumerateClasses.fun();

        System.out.println(enumerateClasses.getName());
        System.out.println(enumerateClasses.getAge());
    }
}
enum EnumerateClasses{
    X("lisi",12),Y,Z;

    private String name;
    private int age;

    public void fun(){
        System.out.println("调用枚举类中的方法");
    }

    EnumerateClasses() {
    }

    EnumerateClasses(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

        对以上代码进行分析,首先先在枚举内初始化 X("lisi","12") 这个方式就是在用私有的有参数的构造器创建对象,因为这个对象是用static final修饰的,该对象将成为类的静态常量,所以可以用枚举名.对象,然后用枚举类型的变量来接收,接着就可以用这个变量名去访问公开的成员了。

 编译器中为枚举新增加了几个方法,下面来展示一下:

public class Enum {
    public static void main(String[] args) {
        EnumerateClasses enumerateClasses = EnumerateClasses.X;
        enumerateClasses.fun();

        System.out.println(enumerateClasses.getName());
        System.out.println(enumerateClasses.getAge());

        //该方法可以得到全部对象,并且放到一个数组中
        EnumerateClasses[] e = EnumerateClasses.values();
        for (int i = 0; i < e.length; i++) {
            EnumerateClasses j = e[i];
            System.out.print(j.getName()+" ");
            System.out.println(j.getAge());
        }

        System.out.println("-----------------------------------------");
        //该方法可以得到指定的对象
        EnumerateClasses name = EnumerateClasses.valueOf("X");
        System.out.print(name.getName() + " ");
        System.out.println(name.getAge());
        //该方法可以得到该对象对应的索引
        System.out.println(name.ordinal());
    }
}
enum EnumerateClasses{
    X("李四",12),Y("王五",22),Z("张三",33);

    private String name;
    private int age;

    public void fun(){
        System.out.println("调用枚举类中的方法");
    }

    EnumerateClasses() {
    }

    EnumerateClasses(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

        1.3对枚举小结:

        第一行定义的是常量,用合法字符来表示,每一个字符都会对应一个对象,该对象是类的静态常量,可以直接被类访问。枚举不能被继承,也不能去new对象,只能在枚举内部创建对象。了解了三个编译器为枚举新增的方法,分别可以得到全部对象,可以得到指定的对象,可以查找该对象的索引。

        1.4抽象枚举概念

        抽象枚举相比与普通的枚举,就是在枚举内部有抽象方法,需要重写抽象方法,才能够在枚举里面创建对象。

代码如下:

public class Text {
    public static void main(String[] args) {
        E e1 = E.CAT;
        E e2 = E.DOG;

        e1.go();
        e2.go();
    }
}
enum E {
    CAT("小猫"){
        @Override
        public void go() {
            System.out.println(getName()+"优雅地走");
        }
    },DOG("傻狗"){
        @Override
        public void go() {
            System.out.println(getName()+"狂跑");
        }
    };

    private String name;
    public abstract void go();

    E(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

        对以上代码简单分析一下,首先枚举里面有一个有参数的构造器,只能用这个构造器来创建对象了,发现枚举里面还有一个抽象方法,如果没有重写这个方法是不能创建对象的,所以在创建对象的时候需要重写方法,这个方式跟匿名内部类很相识的,需要区别开来。重写完方法后,就可以创建对象了,用E的类型变量去接收这些对象。

反编译观察CAT这个类:

       1.5对抽象枚举小结

        枚举如果有定义抽象方法的话,这个就是抽象枚举了。如果这时候创建对象的时候没有去抽象方法进行重写,创建对象就会失败。



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

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

相关文章

spring IOC AOP核心思想

我的理解&#xff1a;一开始各个对象之间相互合作&#xff0c;是多个对象对应多个对象去使用&#xff0c;如果有一个对象出现问题就可能影响到全局&#xff0c;但是使用ioc就是在两者之间加入了一个中间媒介(spring bean也就是通过xml配置文件装配对象)&#xff0c;如果相互需要…

pytorch中nn.DataParallel多次使用

pytorch中nn.DataParallel多次使用 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader# 定义模型 class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.fc nn.Linear(10, 1)def forwa…

Filebeat、metricbeat、kafka

kibana机子上安装filebrat&#xff08;因为有nginx&#xff09; 上传filebrat包 在es概览查看 上传metricbeat 排错 tailf !$ Kibana-Vlsualize查看 kafka(卡夫卡) kafka是一个分布式的消息发布—订阅系统&#xff08;kafka其实是消息队列&#xff09;消息队列中间件 Kafka的…

二十、SpringCloud Alibaba Seata处理分布式事务

目录 一、分布式事务问题1、分布式之前2、分布式之后 二、Seata简介1、Seata是什么&#xff1f;2、Seata能干嘛&#xff1f;3、去拿下&#xff1f;4、怎么玩 三、Seata-server安装四、订单、库存、账户业务数据库准备五、订单、库存、账户业务微服务准备六、Seata原理介绍 一、…

查杀Linux服务器病毒进程并对Linux中的文件描述符FD进行简单探索

一直以来&#xff0c;我都十分推崇把看到的理论知识与实际相结合。 在今天查杀服务器病毒程序的过程中&#xff0c;顺便挖掘了一些新的知识&#xff0c;现在把他总结成一篇文章记录一下。 每一个进程都有一个文件描述符表(通过lsof -p 进程号)&#xff0c;文件描述表是操作系统…

web基础以及http协议

web基础&#xff0c;http协议 域名&#xff1a;www.88886.co DNS解析 静态页面 动态页面 DNS域名&#xff1a; 网络上的通信都是基于IP通信模式&#xff1a;TCP/IP TCP建立连接和断开连接&#xff0c;都是要双方进行确认的 建立连接&#xff1a;三次握手 断开连接&#x…

.net mvc 无法创建虚拟目录和无法启动IIS Express Web服务器指定的url无效 解决方法

.net mvc 无法创建虚拟目录 修改项目配置中web中的项目url时&#xff0c;提示无法创建虚拟目录&#xff0c;则把ip地址改为localhost再进行创建即可 无法启动IIS Express Web服务器指定的url无效 解决方法 不要勾选【覆盖应用程序根URL&#xff08;U&#xff09;】,或让【覆盖…

js中进行数字,超大金额(千位符)格式化处理

前言 最近遇到一个需求,对于社区里讨论的帖子展示一个访问量的计数显示问题,当超过多少页面访问量时,就让其显示xxx万,xx亿 对于后台返回该字段的数据类型是number,需要进行格式化数字的输出 这个应用场景在前端开发中其实很普遍,例如:音乐app里面音乐歌曲播放数量,微博里的…

Unity中Shader的Lambert光照的实现

文章目录 前言一、分别获取Lambert光照模型的每个参数Lambert光照模型公式1、使用 Unity 封装的参数 unity_AmbientSky 获取环境光色2、在属性面板定义一个float类型参数作为光照系数3、获取主平行光的颜色4、获取世界空间下的顶点法向量5、获取反射点指向光源的向量6、使用Lam…

C++day04(类中特殊成员函数、匿名对象、友元、常成员函数和常对象、运算符重载)

1> 思维导图 2> 整理代码 代码&#xff1a; 算术运算符重载&#xff1a; #include <iostream>using namespace std; class Person {//全局函数实现运算符重载需要权限friend const Person operator(const Person L,const Person R); private:int a;int b; publi…

基于Springboot实现点餐平台网站管理系统项目【项目源码+论文说明】分享

基于Springboot实现点餐平台网站管理系统演示 摘要 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多商家的之中&#xff0c;随之就产生了“点餐平台网站”&#xff0c;这样就让点餐平台网站更加方便简单。 对于本…

泛函的含义,泛函分析

经常有同事和朋友讨论泛函分析是做什么的&#xff0c;所以做个小log 1. 泛函的含义 泛函的含义&#xff0c;笼统说&#xff0c;泛函是符合某种性质的任意函数&#xff1b;因为是任意的&#xff0c;所以就是泛泛的&#xff1b;但也没有不着边际的泛。 2. 泛函的例子 2.1 符合半…

uniapp+vue3+ts+uview-plus搭建项目步骤

创建项目 使用Vue3/Vite版&#xff0c;创建以 typescript 开发的工程 下载仓库 DCloud/uni-preset-vue - Gitee.com node版本&#xff1a;v16.18.0 npm版本&#xff1a; v8.19.2 依赖下载 解压之后&#xff0c;在vscode打开 通过终端运行 npm 命令下载依赖&#xff1a;npm ins…

1. Windows平台下如何编译C++版本的Redis库hiredis

Redis是一个key-value存储系统。和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash&#xff08;哈希类型&#xff09;。这些数据类型都支持push/pop、add/remove及取交集并…

Java中的抽象类和接口(Abstract Class and Interface)的区别

在Java面向对象编程中&#xff0c;总会用到接口和抽象类&#xff0c;他们都是对事物的一种抽象&#xff0c;有一些共同点但是也有很多区别。 接口Interface 在Java中接口需要用interface关键字定义&#xff0c;他是对一种行为的抽象&#xff0c;是一种约定的协议&#xff0c;…

微信小程序通过 movable-area 做一个与vuedraggable相似的上下拖动排序控件

因为只是做个小案例 我就直接代码写page页面里了 其实很简单 组件稍微改一下就好了 wxss /* 设置movable-area的宽度 */ .area{width: 100%; }/* a b c 每条元素的样式 */ movable-view {width: 100%;background-color: red;height: 40px;line-height: 40px;color: #FFFFFF;tex…

C语言进阶第五课-----------字符函数和字符串函数

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

库存管理方法有哪些?

本文将为大家讲解&#xff1a;库存管理方法有哪些&#xff1f; 库存管理是企业运营中的核心环节&#xff0c;它涉及到货物的采购、存储、销售和配送。有效的库存管理可以确保企业有足够的货物满足客户的需求&#xff0c;同时避免库存积压和浪费。为了达到这个目标&#xff0c;…

免费开源的非标项目型制造BOM一键导入方案介绍

非标项目型制造&#xff0c;每一个订单都会引入很多新料号、新BoM、新工艺路线。实施ERP/MES系统&#xff0c;实现生产管理数字化&#xff0c;第一步就是要导入这些料号、BoM和工艺。项目型制造&#xff0c;大多数订单只生产一次。但在ERP/MES系统中&#xff0c;订单的料号、Bo…

软件测试之概念篇2(瀑布模型、螺旋模型、增量模型和迭代模型、敏捷模型,V模型、W模型)

目录 开发模型 &#xff08;1&#xff09;瀑布模型 &#xff08;2&#xff09;螺旋模型 &#xff08;3&#xff09;增量模型和迭代模型 &#xff08;4&#xff09;敏捷模型 &#xff08;5&#xff09;测试模型&#xff08;V模型、W模型&#xff09; V模型 W模型 开发模型…