黑马程序员技术交流社区

标题: 枚举的两个方法name,toString [打印本页]

作者: 彭盼    时间: 2012-6-5 20:33
标题: 枚举的两个方法name,toString
我注意到枚举的name(),和toString()方法很相似,都是返回枚举常量的名称,两者有什么重大的区别没
作者: 刘伯阳    时间: 2012-6-5 20:49
枚举类型的name()是不能被覆盖的
但是toString()方法可以覆盖。
作者: 李春阳    时间: 2012-6-5 20:50
本帖最后由 李春阳 于 2012-6-5 20:52 编辑

对比而言:
Enum.name()声明为final,所以不能重写;
而toString()可以重写

给个具体例子:

enum Name
{
   Li,Zhao,Sun,Liu,Wang;
   public String toString()
  {
      return this.name()+"XiaoMing";
   }
}

class People
{
    public static void main(String args[])
    {
        People p=new People();
        p.GiveName();
    }

    public void GiveName()
   {
       for(Name Name:Name.vaWanges())
      {
          System.out.println(Name.name());
          System.out.println(Name.toString());
      }
   }
}

输出为:
Li
LiXiaoMing
Zhao
ZhaoXiaoMing
Sun
SunXiaoMing
Liu
LiuXiaoMing
Wang
WangXiaoMing

作者: 张洁    时间: 2012-6-5 20:58
第一,通过查找 API文档发现这两个方法的定义分别为:
public final String name() { return name; }
public String toString() {return name; }

两个方法都是返回枚举类中的private final String name 。本质上没什么区别。
第二,两个方法的定义。
name()定义的是final String类型的,
而toString()定义的是普通String类型的,这个就是为什么toString()能重写,而name()不能重写。

举个例子来说明下:
public class EnumTest{
     public enum People{
        Chinese("中国人"),England("英国人");
        private String people ;
        private People(String people){
        this.people = people ;
    }
     public String toString(){
         return super.toString()+"("+people+")" ;
     }
}

public static void main(String[] args){
          People people=People.Chinese;
          System.out.println("name->"+people.name());
         System.out.println("toString->"+people.toString());
     }

打印出来的结果是: name->Chinese
                              toString->Chinese(中国人)
区别也就显而易见了,调用name()方法永远只能得到定义的名称,而toString()方法可以重写,你可以得到你想要得到的自定义名称。

如果把上面重写了toString()方法中的super.toString去掉,修改成:
public String toString(){
        return people ;
}
那么得到的结果如下了: name->Chinese
                                        toString->中国人

private People(String people)该构造函数可以有多个参数,参数的个数是由自定义的名称的参数而决定的,
例如可以定义成:
Chinese("中国人",1),American("美国人",2);
private People(String people,int num){ }





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2