A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 彭盼 中级黑马   /  2012-6-5 20:33  /  2836 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我注意到枚举的name(),和toString()方法很相似,都是返回枚举常量的名称,两者有什么重大的区别没

3 个回复

倒序浏览
枚举类型的name()是不能被覆盖的
但是toString()方法可以覆盖。
回复 使用道具 举报
本帖最后由 李春阳 于 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

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
第一,通过查找 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){ }

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马