【疑问解决】- 源码Enmu枚举类的toString里面的name是哪里来的,什么时候传入的?

news2024/11/16 5:40:27

起因是听课到

                

该段的输出boy输出什么?

答案就是输出BOY,但韩老师解释的有点笼统。

但是我看了一眼源码关于这个name确实有点没头绪

public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable {
    /**
     * The name of this enum constant, as declared in the enum declaration.
     * Most programmers should use the {@link #toString} method rather than
     * accessing this field.
     */
    //在enum声明中声明的枚举常量的名称。大多数程序员应该使用{@link #toString}方法,而不是直接访问这个字段。
    private final String name;
    /**
     * Returns the name of this enum constant, exactly as declared in its
     * enum declaration.
     *
     * <b>Most programmers should use the {@link #toString} method in
     * preference to this one, as the toString method may return
     * a more user-friendly name.</b>  This method is designed primarily for
     * use in specialized situations where correctness depends on getting the
     * exact name, which will not vary from release to release.
     *
     * @return the name of this enum constant
     */
    //返回这个枚举常量的名称,与enum声明中的名称完全一致。大多数程序员应该优先使用{@link #toString}方法,因为toString方法可能会返回一个更友好的名称。这个方法主要是为特殊情况设计的,在这种情况下,正确性取决于准确的名称,不同版本的名称不会有变化。@返回这个枚举常量的名称
    public final String name() {
        return name;
    }  
    /**
     * Sole constructor.  Programmers cannot invoke this constructor.
     * It is for use by code emitted by the compiler in response to
     * enum type declarations.
     *
     * @param name - The name of this enum constant, which is the identifier
     *               used to declare it.
     * @param ordinal - The ordinal of this enumeration constant (its position
     *         in the enum declaration, where the initial constant is assigned
     *         an ordinal of zero).
     */
    //唯一的构造函数。程序员不能调用这个构造函数。它由编译器响应enum类型声明而发出的代码使用。

    //* @param name——这个枚举常量的名称,是用来声明它的标识符。

    //* @param ordinal—枚举常量的序号(它的位置

    //*在枚举声明中,初始常量被赋值为0)。
    protected Enum(String name, int ordinal) {
        this.name = name;
        this.ordinal = ordinal;
    }
    /**
     * Returns the name of this enum constant, as contained in the
     * declaration.  This method may be overridden, though it typically
     * isn't necessary or desirable.  An enum type should override this
     * method when a more "programmer-friendly" string form exists.
     *
     * @return the name of this enum constant
     */
    //返回这个枚举常量的名称,正如声明中所包含的。这个方法可能会被重写,尽管它通常不是必要的或理想的。如果存在对程序员更友好的字符串形式,enum类型应该覆盖这个方法。
//@返回这个枚举常量的名称
    public String toString() {
        return name;
    }

源码的注释解释的倒是蛮清楚

翻译如下

//在enum声明中声明的枚举常量的名称。大多数程序员应该使用{@link #toString}方法,而不是直接访问这个字段。

//返回这个枚举常量的名称,与enum声明中的名称完全一致。大多数程序员应该优先使用{@link #toString}方法,因为toString方法可能会返回一个更友好的名称。这个方法主要是为特殊情况设计的,在这种情况下,正确性取决于准确的名称,不同版本的名称不会有变化。@返回这个枚举常量的名称

//唯一的构造函数。程序员不能调用这个构造函数。它由编译器响应enum类型声明而发出的代码使用。

//返回这个枚举常量的名称,正如声明中所包含的。这个方法可能会被重写,尽管它通常不是必要的或理想的。如果存在对程序员更友好的字符串形式,enum类型应该覆盖这个方法。
//@返回这个枚举常量的名称

解决:其实重要的是这一句话Sole constructor.  Programmers cannot invoke this constructor.It is for use by code emitted by the compiler in response to enum type declarations.

        也就是说compiler编译器执行了这一段抽象类的构造器使用,所以在源码中我们是看不见这个String name形式参数是哪一个实际参数传入的,只能知道的是代码运行时,该类被使用(因为程序员写的比如enmu XXX{}实际上是继承了该类)的时候就传入了,而且能确定的是如果子类型enmu XXX{}没有重写,那么这里toString返回的name就是常量名字。

        不过确实,随着编译器版本的不同,这个name也不同。

总结:编译器执行了构造方法的实参的传入,没有显式的表现;传入的时间在代码运行时,该类被使用了,就会创建对象空间

关于enmu 类的枚举可以参考

小谈Java Enum的多态性 - Perifort Pro. - ITeye博客

https://www.cnblogs.com/xiangguoguo/p/9061678.html

还有个rz问题,刚刚我在想为什么enmu Season{}在系统中能默认继承为abstract的Enmu,突然想起来,Enmu类内并没有抽象方法,所以是可以被继承的,就跟下面这个一样。

                 

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

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

相关文章

可自由搭建的能源管理平台,轻松实现高效节能

随着科技的不断发展&#xff0c;能源问题越来越重要。为了提高能源的利用效率&#xff0c;减少能源浪费&#xff0c;能源用能企业纷纷开始注重能源管理工作&#xff0c;并想要一款可以进行高效管理的工具。智慧能源管理平台&#xff0c;是一款可自由搭建的能源管理平台&#xf…

【从0到1设计一个网关】自研网关的架构搭建

文章目录 项目骨架搭建领域模型与DDD核心上下文模型封装静态配置的加载组件生命周期项目骨架搭建 这里我使用的IDE工具是IDEA。 从上文中我们了解到,我们的项目大概有五个模块,Client,Common,Register Center,Config Center,Core这五个模块。 下面开始具体骨架的搭建,…

Mysql在ubuntu22.04上安装配置

更新并下载Mysql sudo apt update sudo apt install mysql-server启动Mysql服务 sudo systemctl start mysql安全配置 包括设置密码、删除匿名用户、禁止远程root登录等&#xff0c;按提示进行即可。 sudo mysql_secure_installation是否设置密码&#xff1a;是 三种强度密…

使用 DDPO 在 TRL 中微调 Stable Diffusion 模型

引言 扩散模型 (如 DALL-E 2、Stable Diffusion) 是一类文生图模型&#xff0c;在生成图像 (尤其是有照片级真实感的图像) 方面取得了广泛成功。然而&#xff0c;这些模型生成的图像可能并不总是符合人类偏好或人类意图。因此出现了对齐问题&#xff0c;即如何确保模型的输出与…

重装win11,个人记录详细步骤-干货

重装win11&#xff0c;个人记录详细步骤-干货 下载镜像-windows官网 https://www.microsoft.com/zh-cn/software-download/windows11%20 安装的选这个就行 虽然他这里写的是家庭版&#xff0c;进去里面就可以选择其他版本 重装win11有个前提 系统最低要求 本文列出了 Windo…

Databend 开源周报第 116 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 特性预览&#…

AR道具贴纸SDK,创新技术解决方案

增强现实&#xff08;AR&#xff09;技术已经成为企业提升用户体验&#xff0c;增强品牌影响力的重要工具。美摄AR道具贴纸SDK&#xff0c;作为一款领先的AR技术产品&#xff0c;致力于为企业提供一站式的技术解决方案&#xff0c;帮助企业轻松实现AR应用的快速开发和部署。 一…

使用Vscode创建一个C_Hello程序

Vscode用来学习C语言语法确实很方便。问题是安装好了&#xff0c;不会用&#xff0c;或编译失败&#xff0c;也是常有的事情&#xff0c;其中一个原因就是不会创建工作区。下面介绍使用Vscode创建一个C语言工作区。有时候看着很简单&#xff0c;时间久了&#xff0c;我竟然忘记…

Element UI + Vue 新增和编辑共用表单校验无法清除问题(已解决)

问题描述 在新增和编辑过程中大部分情况下 两个表单是一致的&#xff0c;而且编辑也有回显需要&#xff0c;所有绝大多数情况下 都是一个表单两个用处&#xff0c;但是随之而来出现了一个无法清除校验的问题&#xff0c;在先点击编辑后再点击新增会出现校验红字&#xff1a; …

centos搭建elastic集群

1、环境可以在同一台集群上搭建elastic&#xff0c;也可以在三台机器上搭建&#xff0c;这次演示的是在同一台机器搭建机器。 2、下载elastic &#xff1a;https://www.elastic.co/cn/downloads/past-releases#elasticsearch 2、​​​​​​ tar -zxvf elasticsearch-xxx-版…

ubuntu18.04双系统安装(2023最新最详细)以及解决重启后发现进不了Ubuntu问题

目录 一.简介 二.安装教程 1.首先确定了电脑的引导格式是UEFIGPT还是BIOSMBR 2. 使用Windows磁盘管理划分足够的磁盘空间 3. 开始安装 三.重启后发现自动进入WIN10系统了&#xff0c;进不了Ubuntu&#xff1f; 一.简介 Linux是一种自由和开放源代码的操作系统内核&#x…

【嵌入式项目应用】__JSON数据格式(无脑操作移植使用)

目录 一、什么是JSON 二、JSON是什么样子的呢&#xff1f; 三、常用类型 四、和XML的比较 五、CJSON库&#xff1f; 六、CJSON库组包与解析示例 1. 确定协议数据 2. 组JSON数据包实例 操作实例&#xff1a; 完整代码&#xff1a; 3. 解析JSON数据包示例 操作实例 完…

【QT】其他常用控件1

新建项目 scrollArea 滚动 toolBox 插入 tabWidget stackedWidget 切换 索引是0 运行后&#xff0c;没有切换按钮&#xff0c;结合pushbutton&#xff0c;加两个Button 代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent)…

Deno 的配置文件、框架,标准库

目录 1、配置文件 imports 和scopes tasks lint fmt lock nodeModulesDir npmRegistry compilerOptions 一个全的示例 2、Web框架 2.1 Deno 原生框架 Fresh Aleph Ultra Lume Oak 3、标准库 3.1 版本和稳定性 1、配置文件 Deno支持一个配置文件&#xff0c…

Unity 中使用波浪动画创建 UI 图像

如何使用 只需将此组件添加到画布中的空对象即可。强烈建议您将此对象放入其自己的画布/嵌套画布中&#xff0c;因为它会弄脏每一帧的画布并导致重新生成整个网格。 注意&#xff1a;不支持切片图像。 using System.Collections.Generic; using UnityEngine; using UnityEng…

算法通关村第十一关白银挑战——位运算符的高频算法题

大家好&#xff0c;我是怒码少年小码。 今天讲讲几个位运算的经典算法。 位移的妙用 1. 位1的个数 LeetCode 191&#xff1a;编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 ‘1’ 的个…

html 常见兼容性问题

目录 前言: 用法: 代码: 1. 盒模型差异: 2. 表格布局问题: 3. 浏览器前缀问题: 4. 字体渲染问题: 理解: 讨论: 前言: 在Web开发中&#xff0c;兼容性问题是常见的挑战之一。不同的浏览器和设备可能以不同的方式解释和呈现HTML&#xff0c;导致网页在某些环境下出现问题…

fastjson对象序列化的问题

今天偶然遇到一个fastjson将字符串反序列化为一个对象的时候的问题&#xff0c;就是简单的通过com.alibaba.fastjson.JSON将对象转为字符串&#xff0c;然后再从字符串转换为原类型的对象。 涉及的代码也非常简单 package cn.edu.sgu.www.mhxysy.service.role.impl;import cn…

单片机设计基于STM32的空气净化器设计

**单片机设计介绍&#xff0c;1615[毕设课设]基于STM32的空气净化器设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图pcb设计图 五、 程序六、 文章目录 一 概要 此设计资料主要包含原理图、PCB、源程序、元器件清等资料&#xff0c; 二、功能设计 设计思路 …

uniapp--点击上传图片到oss再保存数据给后端接口

项目采用uniapp与uview2.0组件库 --1.0的也可以参考一下&#xff0c;大差不差 一、项目要求与样式图 点击上传n张图片到oss&#xff0c;然后点击提交给后端 二、思路 1、打开上传按钮&#xff0c;弹出框内出现上传图片和提交按钮 2、点击上传图片区域&#xff0c;打开本地图…