Java枚举类型的原理
Posted 汤高
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java枚举类型的原理相关的知识,希望对你有一定的参考价值。
[java] view plain copy- package com.lxq.enumm;
- public enum Color
- RED
- public String getName()
- return "红色";
- ,GREEN
- public String getName()
- return "绿色";
- ,YELLOW
- public String getName()
- return "黄色";
- ;
- public abstract String getName();
如果RED只是一个Color类的一个static final的实例,那么上面的代码就很让了费解了,为什么在枚举类型中可以有一个抽象方法,而每个枚举值可以对其重新实现?
别急,看了我对这个类的测试代码你就明白,测试代码如下:
[java] view plain copy
- import java.lang.reflect.Modifier;
- public class EnumDemoFour
- public static void main(String[] args)
- //打印该枚举值的名称
- System.out.println(Color.RED.getName());
- //打印该枚举值的类
- System.out.println(Color.RED.getClass());
- //打印该枚举值的类的父类
- System.out.println(Color.RED.getClass().getSuperclass());
- //打印该枚举值的类的父类的父类
- System.out.println(Color.RED.getClass().getSuperclass().getSuperclass());
- //打印该枚举类型的修饰符
- System.out.println(Modifier.toString(Color.class.getModifiers()));
- /*运行结果
- 红色
- class com.lxq.enumm.Color$1
- class com.lxq.enumm.Color
- class java.lang.Enum
- public abstract*/
该运行结果首先说明了RED和Color不是同一个类,而是前者是后者的一个子类;同时也说明了enum申明的其实是一个abstract的类,所以Color中可以有抽象方法。
那么,我们应该这么理解枚举类型的原理,首先enum Color继承了java.lang.Enum这个抽象类,但enum Color还是一个抽象类,所以它可以有抽象方法和非抽象方法。
而enum Color中的枚举值变量RED事实上上Color的一个匿名子类,所以它可以实现Color中的抽象方法,这样,当我们调用System.out.println(Color.RED.getName());
就是调用了匿名子类实现的方法。当然这些过程的很多事都有编译器等为我们做了,所以这里的代码很简单。
要是你不明白上面打印的内容,我再提供一个普通的类给你看看,还是类似的效果哦。
[java] view plain copy
- public abstract class TestInnerClass
- public abstract void dosomething();
- public static void main(String[] args)
- TestInnerClass tic=new TestInnerClass()
- @Override
- public void dosomething()
- System.out.println("我是匿名子类");
- ;
- tic.dosomething();
- System.out.println(tic.getClass());
- /*输出结果
- 我是匿名子类
- class TestInnerClass$1
- */
最后再附上网上一个 使用Java普通类模拟枚举的例子http://blog.csdn.net/xyang81/article/details/7185428,这个例子真的很好。
使用Java普通类模拟枚举
[java] view plain copy
- import java.util.HashMap;
- import java.util.Map;
- /**
- * 模拟星期中的表示的天,每个星期天都表示一个对象
- * 1、类中的每一个枚举成员都是该类的一个实例对象
- * 2、构造函数私有化
- * 3、提供操作枚举成员的抽象方法和静态方法
- */
- public abstract class WeekDate
- /**
- * 星期一
- */
- public static final WeekDate MON = new WeekDate("MON",0) //匿名子类
- @Override
- public WeekDate nextDay()
- return TUES;
- @Override
- public WeekDate preDay()
- return SUN;
- @Override
- public String toString()
- return "WeekDate.MON";
- ;
- /**
- * 星期二
- */
- 深入Java 1.5枚举类型的内部实现原理