您的位置:首页 > 编程语言 > Java开发

JAVA中的枚举类

2013-01-11 00:26 399 查看
学习C语言的时候就对枚举类比较困惑,现在学JAVA仍然对枚举类比较困惑,因为枚举类的定义和构造与其它一般类差别太大了。

李刚的书上有一道例题,先讲的是怎样手动实现枚举类,我把程序稍加修改之后是这个样子,并且编译运行通过:

public class Season
 { private final String name;
   private final String desc;
   public static final Season SPRING=new Season("春天","春暖花开");
   public static final Season SUMMER=new Season("夏天","夏日炎炎");
   public static final Season FALL=new Season("秋天","秋高气爽");
   public static final Season WINNER=new Season("冬天","鹅毛大雪");
   public static Season getSeason(int seasonNum)
     { switch(seasonNum)
        { case 1:
            return SPRING;
          case 2:
            return SUMMER;
          case 3:
            return FALL;
          case 4:
            return WINNER;
          default:
            return null;
          }
       }
  private Season(String name,String desc)
    { this.name=name;
      this.desc=desc;
     }
  public String getName()
   { return this.name;
    }
  public String getDesc()
   { return this.desc;
    }
}

import java.util.Scanner;

public class TestSeason

{

  public static void main(String args[])

   { System.out.println("请输入一个季节,1代表春天,2代表夏天,3代表秋天,4代表冬天");

    Scanner sc=new Scanner(System.in);

    int a=sc.nextInt();

  System.out.println(Season.getSeason(a).getName()+",这真是一个"+Season.getSeason(a).getDesc()+"的季节");

    }

}

手动实现枚举类时其属性、构造器都是私有的,而且构造器是静态的,由类本身调用。手动构造枚举类时枚举类可以有的对象都已经创建好,这一点与其它类不一样,其它类一般都是先定义类,然后再新建对象,比较分明,但枚举类类定义本身和它的对象都放到类里面了,脑子要适应这一点。

然后是J2SE1.5新增的enum关键字,用于创建枚举类。它创建的枚举类都是继承java.lang.Enum类,而不是Object类。可以直接这样创建一个枚举类:

public enum Season

{ spring,sunmmer,fail,winner;//枚举类的实例并不一定是要大写,但为了便于知晓它是枚举类一般大写

}

看上面这个枚举类猛的觉得不太适应,怎么就几个字母就是枚举类的实例对象吗?是的。只不过上面的枚举类中没有定义属性和方法(这个枚举类的实例都没有属性),也没有定义私有的构造器,所以看起来才觉得比较别扭,可以写成这样:

public enum Season

{ spring,sunmmer,fail,winner;

  private String name; //属性

  private Season(String name)

  { this.name=name; }

}
但是有没有发现,上面枚举类中的构造器并没有什么用处,因为枚举类规定它的实例必须显式列出,所以该类的实例已经列出了,就是spring,sunmmer,fail,winner,所以也就不会再调用其构造器了,进一步可以写成这样:

public enum Season

{ spring("春天"),sunmmer("夏天"),fail("秋天"),winner("冬天");

  private String name; //属性

  private Season(String name)

  { this.name=name; }

}

这样就可以在构造这四个对象实例的时候指定它的属性是什么了,注意代码 spring("春天")中的sping并不是一个对象,并不是spring对象后又跟了个("春天"),spring只有调用了构造器后才能被实例化。

其实上面的spring("春天")等同于这行代码:

public static final Season spring=new Season("春天");

但只是“等同于”,你不能替换的,如下面这行代码就会出错:

public enum Season
{ public static final Season spring=new Season("春天");
  private String name; //属性
  private Season(String name)
  { this.name=name; }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: