---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
1、 枚举概述
是java在JDK1.5后新加入的特性,是描述常量值的一个“集合”,在java中用一个特殊的类型enum来封装,这个特殊的类定义的是固定的值对象,其声明的值不希望再被定义,类似于单例模式。如有这样一个需求:想要定义一个Color类,只有Red、Green、Blue这3个值,其他任何值都是非法的,虽然以前能构造出这样的代码,但是要做很多工作,且存在安全性问题,但有了枚举就简单了。
2、 普通类模拟枚举功能
模拟枚举的一个普通类,需要有以下特点:
(1) 私有化构造方法。
(2) 每一个元素都是一个实例对象。
(3) 每个对象都用public final static修饰。
(4) 可以定义公有方法和抽象方法。
//普通类模拟枚举
public abstract class EnumDemo
{
private EnumDemo()
{//私有化了构造函数,外部不可创建对象了
}
//可以定义抽象方法
public abstract EnumDemo fun();
//SUN即为一个值对象,用public final static修饰
public final static EnumDemo SUN = new EnumDemo()
{//在构建对象时复写抽象方法
public EnumDemo fun()
{
return null;
}
};
//不同对象都要复写
public final static EnumDemo MON = new EnumDemo()
{
public EnumDemo fun()
{
return null;
}
};
}
3、 枚举的应用
(1) 枚举的基本格式
public enum Color
{
//枚举对象,被要求必须定义在第一行
RED,GREEN,BLUE
}
(2) 枚举的一些常用方法
枚举实际也是继承Object,所以Object的方法,枚举也是含有的。其实枚举就是一个特殊的类,它独有的一些方法为:
//比较此枚举与指定对象的顺序
int compareTo(E e)
//返回此枚举常量的名称,在其枚举声明中对其进行声明
String name()
//返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)
int ordinal()
//静态方法valueOf,如,返回RED值对象的字串值
枚举名.valueOf(“RED”).toString()
//静态方法values,返回一个数组,保存所有枚举值
枚举名.values().length//个数
(3) 枚举中可定义成员
枚举就是一个特殊类,所以他能
定义普通方法和抽象方法,定义构造函数,不过是私用的,能实现接口等。
看下面的一个综合例子:
interface Inter
{
public String getName();
}
//实现接口
enum MyEnum implements Inter
{
//枚举值在第一行,先用带参的构造函数
NAME_A("aaaa"){
publicvoid fun(){//实现抽象方法
}
},//注意这里的逗号
NAME_B("bbbb")
{
//实现抽象方法
public void fun(){}
};//分号
private String name;//变量
MyEnum(String name)//定义的带参构造函数
{
this.name = name;
}
@Override
public String getName()//复写接口方法
{
return name;
}
public void fun2()
{
//普通方法
}
public abstract void fun();//抽象方法
}
public class EnumTest
{
public static void main(String[] args)
{
//调用,由于枚举创建器值就固定,就只能取值了
System.out.println(MyEnum.NAME_A);//结果为NAME_A
System.out.println(MyEnum.NAME_B.getName());//结果为bbbb
}
}
4、 枚举的一些特点
(1) 枚举值必须定义在第一行
(2) 构造函数必须私有
(3) 因为ENUM类的定义时实现了Comparable接口,所以枚举的内容可以进行排序。
(4) Enum类实现了Serializable接口,枚举可序列化
(5) 不可再继承,enum默认已经继承了Enum,Java只能单继承,所以不能在继承了,但可再实现接口。
不能派生,枚举构造函数私有,其实是种单例模式,子类发现不了父类的构造函数,派生不了,如果拿一个枚举类去反编译,发现它是一个被final修饰的类,final修饰的类不能派生。
---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------