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


    起因是听课到

                    

    该段的输出boy输出什么?

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

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

    1. public abstract class Enumextends Enum>
    2. implements Comparable, Serializable {
    3. /**
    4. * The name of this enum constant, as declared in the enum declaration.
    5. * Most programmers should use the {@link #toString} method rather than
    6. * accessing this field.
    7. */
    8. //在enum声明中声明的枚举常量的名称。大多数程序员应该使用{@link #toString}方法,而不是直接访问这个字段。
    9. private final String name;
    10. /**
    11. * Returns the name of this enum constant, exactly as declared in its
    12. * enum declaration.
    13. *
    14. * Most programmers should use the {@link #toString} method in
    15. * preference to this one, as the toString method may return
    16. * a more user-friendly name. This method is designed primarily for
    17. * use in specialized situations where correctness depends on getting the
    18. * exact name, which will not vary from release to release.
    19. *
    20. * @return the name of this enum constant
    21. */
    22. //返回这个枚举常量的名称,与enum声明中的名称完全一致。大多数程序员应该优先使用{@link #toString}方法,因为toString方法可能会返回一个更友好的名称。这个方法主要是为特殊情况设计的,在这种情况下,正确性取决于准确的名称,不同版本的名称不会有变化。@返回这个枚举常量的名称
    23. public final String name() {
    24. return name;
    25. }
    26. /**
    27. * Sole constructor. Programmers cannot invoke this constructor.
    28. * It is for use by code emitted by the compiler in response to
    29. * enum type declarations.
    30. *
    31. * @param name - The name of this enum constant, which is the identifier
    32. * used to declare it.
    33. * @param ordinal - The ordinal of this enumeration constant (its position
    34. * in the enum declaration, where the initial constant is assigned
    35. * an ordinal of zero).
    36. */
    37. //唯一的构造函数。程序员不能调用这个构造函数。它由编译器响应enum类型声明而发出的代码使用。
    38. //* @param name——这个枚举常量的名称,是用来声明它的标识符。
    39. //* @param ordinal—枚举常量的序号(它的位置
    40. //*在枚举声明中,初始常量被赋值为0)。
    41. protected Enum(String name, int ordinal) {
    42. this.name = name;
    43. this.ordinal = ordinal;
    44. }
    45. /**
    46. * Returns the name of this enum constant, as contained in the
    47. * declaration. This method may be overridden, though it typically
    48. * isn't necessary or desirable. An enum type should override this
    49. * method when a more "programmer-friendly" string form exists.
    50. *
    51. * @return the name of this enum constant
    52. */
    53. //返回这个枚举常量的名称,正如声明中所包含的。这个方法可能会被重写,尽管它通常不是必要的或理想的。如果存在对程序员更友好的字符串形式,enum类型应该覆盖这个方法。
    54. //@返回这个枚举常量的名称
    55. public String toString() {
    56. return name;
    57. }

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

    翻译如下

    //在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类内并没有抽象方法,所以是可以被继承的,就跟下面这个一样。

                     

  • 相关阅读:
    卷积神经网络应用实例,卷积神经网络实际应用
    数据库优化
    Telemetry原理
    (60)矩阵中的局部最大值
    Sql注入(手工注入思路、绕过、防御)
    ES本地分片逆文档频率评分策略(Shard Local IDF)导致的评分异常原理解析
    汽车厂商查询易语言代码
    [Linux]进程间通信--共享内存
    Linux内存管理 | 二、虚拟地址空间布局
    关于Transfomer的思考
  • 原文地址:https://blog.csdn.net/qq_41891655/article/details/134023916