java中直接输出Enum枚举类型返回的是对象名

  • Post author:
  • Post category:java



Enum类的toString()方法

  • /**
         * 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
         */
        public String toString() {
            return name;
        }



    • 最后一句

      可以得知,Enum类的toString()方法是返回枚举对象的常量名,而不是属性值

      enum  Season{
          SPRING("春天");
          private String name;
          Season(String name) {
              this.name = name;
          }
      }
      System.out.println(Season.SPRING);//此时输出 "SPRING" ,而不是春天
      ​
      //如果重写此方法,即使完封不动,就会返回属性名了
      enum  Season{
          SPRING("春天");
          private String name;
          Season(String name) {
              this.name = name;
          }
          public String toString() {
              return name;
          }
      }
      System.out.println(Season.SPRING);//此时输出 "春天"


      我的分析

      private final String name;
      private final int ordinal;
      protected Enum(String name, int ordinal) {
          this.name = name;
          this.ordinal = ordinal;
      }
      ​
      /*
      Sole constructor. Programmers cannot invoke this constructor. It is for use by code emitted by the compiler in response to enum type declarations
      */
      /*
      唯一的构造器。程序员不能调用此构造函数。它供编译器响应枚举类型声明而发出的代码使用
      */
      /*
      name – - The name of this enum constant, which is the identifier used to declare it.
      ordinal – - The ordinal of this enumeration constant (its position in the enum declaration, where the initial constant is assigned an ordinal of zero).
      */
      /*
      name––此枚举常量的名称,它是用于声明它的标识符。
      ordinal––此枚举常量的序数(其在枚举声明中的位置,初始常量的序数为零)。
      */
      • 由此可见,

        name和ordinal都是Enum类自己独有的属性

        ,且由构造器初始化,但是子类并不能调用这个构造器,

        它的调用是随着创建枚举对象而自行调用,name代表创建的当前枚举对象名字,ordinal代表当前枚举对象是第几个,从0开始计数

        ,因此

        enum

        实现的枚举类中也不必初始化它。


        • 即可以理解为自己创建的SPRING对象有name属性,而SPRING对象自己则是作为Enum类的name属性传入,它自带的toString()方法是在Enum类里面的,我们是用是因为继承了它,但是属性没有动态绑定机制,因此返回的是Enum类中的name属性,即SPRING,如需要返回自己定义的name属性,就需要重写toString()


        • 所以这个name和自己定义的name不是同一个意思,Enum里的name特指常量名也就是枚举对象名,如果自己不重写

          toString()

          则会返回Enum类里的name属性而不是自己的name属性,即返回常量名



        • ordinal

          则是记录当前创建了多少个枚举对象



版权声明:本文为w55935原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。