java再复习-枚举的使用及其实现原理

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();
	}
	
}





猜你喜欢

转载自blog.csdn.net/sinat_31311947/article/details/61615608
今日推荐