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
则是记录当前创建了多少个枚举对象
。
-
-
-