Java进阶学习笔记20——枚举

认识枚举:

枚举是一种特殊的类。

枚举类的格式:

说明:

第一行是罗列枚举的对象名称。只能写合法的标识符(名称),多个名称用逗号隔开。

这些名称本质上都是常量每个变量都会记住枚举类的一个对象。

第二行:可以是类的五大成员。

反编译的情况,我们看到有一个私有的构造器:

javap的用法:我们可以看到更详细的枚举类信息:

枚举类的特点:

枚举类的第一行只能罗列一些名字,这些名称都是常量,并且每个常量记住的都是枚举类的一个一对象。

枚举类的构造器都是私有的(写不写都只能是私有的),因此,枚举类不能创建对象。

枚举类是最终类,不可能被继承。

枚举类中,从第二行开始,可以定义类的其他成员。

编译器为枚举类新增了几个方法,并且枚举类都是继承java.lang.enum类的,从enum类也会继承到一些方法。

测试类:

package cn.ensource.d6_enum;

public class Test {
    public static void main(String[] args) {
        // 目标:认识枚举
        A a1 = A.X;
        System.out.println(a1);

        // 枚举不能创建对象

        // 枚举类的第一行都是常量,记住的是枚举类的对象
        A a2 = A.Y;
        System.out.println(a2);

        // 枚举类提供了一些额外的API
        A[] as = A.values();   // 拿到全部对象

        A a3 = A.valueOf("Z");
        System.out.println(a3.name());
        System.out.println(a3);
        System.out.println(a3.ordinal());  // 索引

    }
}

那抽象枚举如何实现呢?

 

package cn.ensource.d6_enum;

// 抽象枚举
public enum B {
    // 抽象枚举,如何逻辑枚举,因为枚举类B不能直接构建对象,而第一行都是枚举类的对象
    // 那么就要调用私有的构造器来创建对象,里面需要使用方法重写来把抽象方法重写,多态
    X() {     // 构造器
        @Override
        public void go() {     // 构建对象的时候,重写go方法

        }
    },
    Y("张三") {
        @Override
        public void go() {
            System.out.println(getName() + "在跑~");
        }
    };

    private String name;

    private B() {
    }

    private B(String name) {
        this.name = name;
    }

    public abstract void go();

    public String getName() {
        return name;
    }

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

这个代码已经算是比较深了。

测试类中:

多学一招:

使用枚举类实现单例设计模式:

package cn.ensource.d6_enum;

public enum C {
    X;    // 单例
}

好牛啊!!!

枚举的常见应用场景:

非常适合用来表示一组信息,然后作为参数进行传播。

用来做信息的分类和标志。

选择定义一个一个的常量来表示一组信息,并作为参数传输。

参数值不受约束;

选择定义枚举表示一组信息,并作为参数传递。

代码可读性好,参数值得到了约束,对使用者更友好,建议使用。

常量类Constant:

package cn.ensource.d7_enum;

public class Constant {
    public static final int BOY = 0;    // 常量性能没有影响
    public static final int GIRL = 1;
}

测试类:

package cn.ensource.d7_enum;

public class Test {

    public static void main(String[] args) {
        // 目标:掌握枚举的应用场景,做信息标志和分类
//        check(0);
        check(Constant.BOY);
    }

    public static void check(int sex) {
        switch (sex) {     // 硬编码,可读性不好
            case Constant.BOY:
                System.out.println("展示男人想看的信息");
                break;
            case Constant.GIRL:
                System.out.println("展示女人想看的信息");
                break;
        }
    }
}

这个是软编码。

常量还是存在一个问题:

要求是常量,我们还是写自变量。

int sex形参是不受约束的。

常量类Constants2:

package cn.ensource.d7_enum;

public enum Constant2 {
    BOY, GIRL;
}
package cn.ensource.d7_enum;

public class Test {

    public static void main(String[] args) {
        // 目标:掌握枚举的应用场景,做信息标志和分类
//        check(0);
        check(Constant2.BOY);
    }

    public static void check(Constant2 sex) {
        switch (sex) {     // 硬编码,可读性不好
            case BOY:
                System.out.println("展示男人想看的信息");
                break;
            case GIRL:
                System.out.println("展示女人想看的信息");
                break;
        }
    }
}

Constant2是一个枚举类型,里面有BOY和GIRL两个枚举对象。

然后使用枚举对象做形参。

有约束性、严谨!

对程序员也比较友好!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

z3-加法器实验

补码器加减法,运算方法简介 我们要知道什么是补码的加法,我们为什么要用补码的加法? 补码的加法其实就是将两个补码形式的二进制数字直接相加,处理的时候忽略超出固定位数的进位。补码的加法运算和无符号二进制数的加法操作一样&…

哈希双指针

文章目录 一、哈希1.1两数之和1.2字母异位词分组1.3最长子序列 二、双指针2.1[移动零](https://leetcode.cn/problems/move-zeroes/description/?envTypestudy-plan-v2&envIdtop-100-liked)2.2[盛最多水的容器](https://leetcode.cn/problems/container-with-most-water/d…

新人攻略:避开这3大坑,让老员工主动带你飞!

进入职场的新人们,常常会感到困惑和挑战。他们可能会发现自己在与老员工的交流中遇到难题,甚至发现老员工并不愿意花费时间和精力去指导他们。这背后的原因是什么呢?又该如何改善这一现象呢?本文将从新员工的角度出发,…

C# WPF入门学习(二)——创建一个demo工程

本期任务:创建一个按钮,点击之后在控制台打印文本,设置背景图片、圆角按钮加分。 一、创建WPF项目 创建工程 1. 打开VS 我用的2019 2. 打开界面 3. 选择创建项目 4. 选择C#中的WPF框架 5. 填写项目名称和选择路径 新项目就创建好了&#…

彩虹聚合二级域名DNS管理系统源码v1.3

聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析, 目前已支持的域名平台有:阿里云、腾讯云、华为云、西部数码、CloudFlare。 本系统支持多用户,每个用户可分配不同的域名解析权限;支持API接口, 支持获…

(Java面试题分享)万里长征-03-搜狐

万里长征-03-搜狐 ⚙ 以下内容基于GPT-4o模型 问题 1.LeetCode103 二叉树的锯齿形层序遍历 103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode) 2.LeetCode5 最长回文子串 5. 最长回文子串 - 力扣(LeetCode) 3.Kafka为何那么快 …

Win32 API

个人主页:星纭-CSDN博客 系列文章专栏 : C语言 踏上取经路,比抵达灵山更重要!一起努力一起进步! 一.Win32 API 1.Win32 API介绍 Windows这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外,它同时也是…

【达梦系列】IFUN_DATETIME_MODE 导致【无效的客户端版本】

问题描述 在项目开发时,应用程序连接达梦数据库报错:无效的客户端版本。这个问题在没有调整达梦数据参数之前是正常的,调整之后就不对了,但是又不清楚到底是哪个参数的问题。因为调整达梦参数时,用了一个达梦的参数调…

python数据分析——字符串和文本数据2

参考资料:活用pandas库 1、字符串格式化 (1)格式化字符串 要格式化字符串,需要编写一个带有特殊占位符的字符串,并在字符串上调用format方法向占位符插入值。 # 案例1 varflesh wound s"Its just a {}" p…

求斐波那契数列第n项的值

本期介绍🍖 主要介绍:什么是斐波那契数列,递归实现求斐波那契数列第n项值,递归法为什么不适合求斐波那契数,用迭代法实现求斐波那契数列的值👀。 文章目录 1. 斐波那契数列是什么?2. 题目2. 递归…

Java开发大厂面试第26讲:生产环境如何排查问题和优化 JVM?

通过前面几个课时的学习,相信你对 JVM 的理论及实践等相关知识有了一个大体的印象。而本课时将重点讲解 JVM 的排查与优化,这样就会对 JVM 的知识点有一个完整的认识,从而可以更好地应用于实际工作或者面试了。 我们本课时的面试题是&#x…

【气象常用】间断时间序列图

效果图: 主要步骤: 1. 数据准备:随机数组 2. 图像绘制:绘制间断的时间序列 详细代码:着急的直接拖到最后有完整代码 步骤一:导入库包及图片存储路径并设置中文字体为宋体,西文为新罗马&…

Foxit PDF Editor Pro福昕PDF编辑器Pro:重塑您的文档编辑体验

在信息爆炸的时代,PDF文件因其跨平台、格式稳定等特性,成为我们日常工作与学习中不可或缺的一部分。然而,面对这些文件时,许多人都会遇到一个共同的难题:如何高效、专业地编辑PDF内容?今天,我要…

企业内网开源OA服务器(办公自动化系统),搭建O2OA基于Linux(openEuler、CentOS8)

本实验环境为openEuler系统(以server方式安装)(CentOS8基本一致,可参考本文) 目录 知识点实验下载安装O2OA安装mysql配置O2OA 知识点 “O2OA” 是一个开源的、基于Java的办公自动化(Office Automation)系统。其名称中的“O2OA”…

CnosDB:深入理解时序数据质量函数

在CnosDB中,我们设计并实现了计算数据质量的多个指标,这些指标可以从多个维度评估时序数据的质量,对于时间戳列,我们考虑数据的缺失点、冗余点和延迟点。对于值列,我们考虑数据的异常值、范围、变化、速度和加速度。 C…

【对角线遍历】python

没啥思路 class Solution:def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:mlen(mat)nlen(mat[0])ret[]if len(mat)0:return retcount0#mn-1是对角线总数while count<mn-1:#x和y的和刚好是count数#偶数为右上走if count%20:xcount if(count<m)else (…

(二十一)【Jmeter】定时器作用域

简述 由于在性能测试中,要模拟用户操作时间差,需要设置操作之间的等待时间,Jmeter中有定时器,那么在使用定时器之前,需要了解定时器的工作原理,是否符合我们业务场景的执行要求? 该文主要讲解Jmeter中定时器作用范围,本次文主要使用两种简单模型来进行说明,可以基于这…

Java进阶学习笔记14——模板方法设计模式

面试和看源码。 谈到设计模式&#xff1a; 1、解决了什么问题&#xff1f; 2、怎么写&#xff1f; 模板方法设计模式解决了什么问题&#xff1f; 解决方法中存在重复代码的问题。 写法&#xff1a; 1&#xff09;定义一个抽象类&#xff1a; 2&#xff09;在里面定义两个方…

【限免】短时傅里叶变换时频分析【附MATLAB代码】

来源&#xff1a;微信公众号&#xff1a;EW Frontier 简介 一种能够同时对信号时域和频域分析的方法——短时傅里叶变换&#xff08;STFT&#xff09;&#xff0c;可以在时频二维角度准确地描述信号 的时间、频域的局部特性&#xff0c;与其他算法不同&#xff0c;通过该算法可…

类和对象【六】友元和内部类

文章目录 友元友元的作用友元的缺点友元函数语法&#xff1a;特点&#xff1a; 友元类语法&#xff1a;特点&#xff1a; 内部类概念特点 友元 友元的作用 友元提供了一种打破封装的方式&#xff0c;有时提供了便利。 友元的主要作用就是打破封装 即可以让一个类的友元函数…