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

    xiaoxiao2021-03-25  48

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

    转载请注明原文地址: https://ju.6miu.com/read-32765.html

    最新回复(0)