面向对象(七)
今天我要总结下枚举类的知识
1.初入枚举类。
枚举类的定义很抽象,枚举类中的对象是固定且有限的。那么如何创造出一个枚举类呢?
a.构造器全用private隐藏起来。
b.把类中所有可能实例都用public static final修饰的类变量保存起来,所以枚举类不能派生子类。
c.可以提供一些静态方法,允许其他程序根据特定参数获取与之匹配的实例。
例:
public class SeasonTest
{
public SeasonTest(Season s)
{
System.out.println(s.getName() +
",这真是一个"+ s.getDesc() + "的季节");
}
public static void main(String[] args)
{
//直接使用Season的FALL常量代表一个Season对象
//输出秋天,这真是一个秋高气爽的季节
new SeasonTest(Season.FALL);
}
}
class Season
{
//把Season类定义成不可变的,将其Field也定义成final
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 WINTER
= 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 WINTER;
default :
return null;
}
}
//将构造器定义成private访问权限
private Season(String name , String desc)
{
this.name = name;
this.desc = desc;
}
//只为name和desc提供getter方法
public String getName()
{
return this.name;
}
public String getDesc()
{
return this.desc;
}
}
这是一个网上的枚举类代码,仅供参考。
还有另外一种定义枚举类的方式:Java5新增了一个关键字enum,用于定义枚举类。
注:a.枚举类可以实现一个或多个接口,使用Enum定义的枚举类默认继承java.lang.Enum类。
b.使用enum定义,非抽象的枚举类会默认使用final修饰。
c.枚举类的实例必须在第一行现式列出,否则将产生不出实例。
例:
public class EnumTest
{
public void judge(SeasonEnum s)
{
//switch语句里的表达式可以是枚举值
switch (s)
{
case SPRING:
System.out.println("春暖花开,正好踏青");
break;
case SUMMER:
System.out.println("夏日炎炎,适合游泳");
break;
case FALL:
System.out.println("秋高气爽,进补及时");
break;
case WINTER:
System.out.println("冬日雪飘,围炉赏雪");
break;
}
}
public static void main(String[] args)
{
//所有枚举类都有一个values方法,返回该枚举类的所有实例
for (SeasonEnum s : SeasonEnum.values())
{
System.out.println(s);
}
//平常使用枚举实例时,
//总是通过EnumClass.variable形式来访问
new EnumTest().judge(SeasonEnum.SPRING);
}
}
enum SeasonEnum
{
// 在第一行列出4个枚举实例
SPRING,SUMMER,FALL,WINTER;
}
这是一个网上的使用enum定义的枚举类代码,仅供参考。
通过对上面两个代码的研究,我想大概可以算是对枚举类有了一定的了解。我们从上面两个代码的对比中
不难发现,使用Enum十分方便。现在让我们来看java.lang.Enum类中所提供的方法:
a.int compareTo(E o):从英文的理解上可以看做是比较,它用来比较枚举类中对象的顺序,如果该枚举
对象在指定枚举类对象之后则返回正整数,若该枚举对象在指定枚举类对象之前则返回负整数,反之则为
零。
b.String toString():返回枚举常量的名称。
c.String name():很好理解,就是返回枚举实例的名称,和toString方法相似,但优先考虑toString方法
,因为他的返回更友好。
d.int ordinal():返回枚举值在枚举类中的索引值(就是枚举值在枚举声明中的位置,第一个枚举值的索
引值为0)。
e.valueOf方法:返回枚举类中指定名称的枚举值。
2.枚举类的Field,方法和构造器。
定义一个实例变量:
public enum SeasonEnum
{
SPRING,SUMMER,FALL,WINTER;
public String name;
}
定义枚举类方法:
public enum SeasonEnum
{
SPRING,SUMMER,FALL,WINTER;
private String season;
public void setSeason(String season)
{
case SPRING:
if(name.equals("春季"))
{
this.season = season;
}
else
{
System.out.println("参数不匹配");
}
break;
case SUMMER:
//同上
......
case FALL:
//同上
......
case WINTER:
//同上
......
}
public String getSeason()
{
return this.season;
}
}
定义枚举类构造器:
public enum SeasonEnum
{
SPRING("春季"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天");
private final String season;
//枚举类的构造器只能使用private修饰
private SeasonEnum(String season)
{
this.season = season;
}
public String getSeason()
{
return this.season;
}
}
另外关于实现接口的枚举类和包含抽象方法的枚举类就不多提了,它和普通的类实现起来差不多,那么今
天就整理到这里了。