学习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; }
}