java在JDK1.5这个重大革命之后,提供了诸如C语言的枚举功能,枚举的使用很简单,简单到刚开始使用的时候不明白为什么。。因为感觉它和以往的java语法不一样。
public class EnumTest {
public static void main(String[] args) {
//使用枚举
Sex man = Sex.MAN;
System.out.println(man);
}
/**
* 定义一个枚举类
* @author lenovo
*
*/
public enum Sex{
/**
* 两个成员。
*/
MAN,FEMAN;
}
}
看着有一点神奇,说起他的用处肯定不用说了,对于某种具有选项性质的值我们就可以用枚举来表示,不用定义一大堆静态常量来表示,然后还需要通过if,else来判断。
比如定义星期几这种需求,红绿灯,或者网络请求时的请求方式,POST,GET这些在开发中肯定定义为枚举的,我们不用关心它的具体值,只关心名字就行了。
那么,枚举到底是如何实现的? 我们现在就通过普通类来实现枚举:
/**
* 用普通类来模拟模拟的实现
* @author lenovo
*
*/
public class EnumSex {
/**
* 私有构造函数,因为枚举不可以new对象
*/
private EnumSex(){
}
//定义一个静态常量对象表示MAN
public static final EnumSex MAN = new EnumSex();
//定义一个静态常量对象表示FEMAN
public static final EnumSex FEMAN = new EnumSex();
}
调用:
public class EnumTest {
public static void main(String[] args) {
//使用枚举
EnumSex feman = EnumSex.FEMAN;
}
}
看到没,其实枚举就是上述那样实现的。
所以我们可以总结一下要点:
一,枚举的构造函数时私有的
二,每一个枚举成员都代表的是一个自身对象
三:枚举一样可以定义方法,重载构造函数,定义抽象方法,然后让每一个成员去实现这个抽象方法,与普通类一样。
不信我们看:
public class EnumTest {
public static void main(String[] args) {
//使用枚举
Sex man = Sex.MAN;
Sex feman = Sex.FEMAN;
System.out.println("man class name : " + man.getClass().getName()+ "..feman class name : " + feman.getClass().getName());
System.out.println(man.getClass() == feman.getClass());
}
/**
* 定义一个枚举类
* @author lenovo
*
*/
public enum Sex{
/**
* 两个成员。
*/
MAN,FEMAN;
}
}
打印结果:
man class name : EnumTest$Sex..feman class name : EnumTest$Sex
true
在枚举中实现抽象方法:
public class EnumTest {
public static void main(String[] args) {
//使用枚举
Sex man = Sex.MAN;
Sex feman = Sex.FEMAN;
System.out.println("man class name : " + man.getClass().getName()+ "..feman class name : " + feman.getClass().getName());
System.out.println(man.getClass() == feman.getClass());
}
/**
* 定义一个枚举类
* @author lenovo
*
*/
public enum Sex{
/**
* 两个成员。因为枚举有了抽象方法就相当于抽象类了
* 抽象类不能直接new对象,所以这种写法就相当于
* 一个匿名子类,并且实现了抽象方法。没毛病,
* 因为每一个成员就是一个类对象。
*/
MAN{
@Override
protected void marrySex() {
//与feman结婚
}
}
,FEMAN{
@Override
protected void marrySex() {
//与MAN结婚
}
};
//抽象方法
protected abstract void marrySex();
}
}