Java枚举类型的原理

Posted 汤高

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java枚举类型的原理相关的知识,希望对你有一定的参考价值。

[java]  view plain  copy  
  1. package com.lxq.enumm;  
  2.   
  3. public enum Color  
  4.   
  5.     RED  
  6.         public String getName()  
  7.             return "红色";  
  8.           
  9.       
  10.     ,GREEN  
  11.         public String getName()  
  12.             return "绿色";  
  13.           
  14.       
  15.     ,YELLOW  
  16.         public String getName()  
  17.             return "黄色";  
  18.           
  19.     ;  
  20.     public abstract String getName();  
  21.   

如果RED只是一个Color类的一个static final的实例,那么上面的代码就很让了费解了,为什么在枚举类型中可以有一个抽象方法,而每个枚举值可以对其重新实现?

别急,看了我对这个类的测试代码你就明白,测试代码如下:

[java]  view plain  copy  
  1. import java.lang.reflect.Modifier;  
  2.   
  3. public class EnumDemoFour  
  4.     public static void main(String[] args)  
  5.         //打印该枚举值的名称  
  6.         System.out.println(Color.RED.getName());  
  7.         //打印该枚举值的类  
  8.         System.out.println(Color.RED.getClass());  
  9.         //打印该枚举值的类的父类  
  10.         System.out.println(Color.RED.getClass().getSuperclass());  
  11.         //打印该枚举值的类的父类的父类  
  12.         System.out.println(Color.RED.getClass().getSuperclass().getSuperclass());  
  13.         //打印该枚举类型的修饰符  
  14.         System.out.println(Modifier.toString(Color.class.getModifiers()));  
  15.          
  16.     /*运行结果 
  17.     红色 
  18.     class com.lxq.enumm.Color$1 
  19.     class com.lxq.enumm.Color 
  20.     class java.lang.Enum 
  21.     public abstract*/  
  22.   

该运行结果首先说明了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  
  1. public abstract class TestInnerClass  
  2.   
  3.     public abstract void dosomething();  
  4.     public static void main(String[] args)  
  5.         TestInnerClass tic=new TestInnerClass()  
  6.             @Override  
  7.             public void dosomething()  
  8.               
  9.                 System.out.println("我是匿名子类");  
  10.                  
  11.         ;  
  12.         tic.dosomething();  
  13.         System.out.println(tic.getClass());  
  14.       
  15.     /*输出结果 
  16.     我是匿名子类 
  17.     class TestInnerClass$1 
  18.     */  
  19.   

最后再附上网上一个 使用Java普通类模拟枚举的例子http://blog.csdn.net/xyang81/article/details/7185428,这个例子真的很好。

使用Java普通类模拟枚举

[java]  view plain  copy  
  1. import java.util.HashMap;  
  2. import java.util.Map;  
  3.   
  4. /** 
  5.  * 模拟星期中的表示的天,每个星期天都表示一个对象 
  6.  * 1、类中的每一个枚举成员都是该类的一个实例对象 
  7.  * 2、构造函数私有化 
  8.  * 3、提供操作枚举成员的抽象方法和静态方法 
  9.  */  
  10. public abstract class WeekDate   
  11.     /** 
  12.      * 星期一 
  13.      */  
  14.     public static final WeekDate MON = new WeekDate("MON",0//匿名子类  
  15.         @Override  
  16.         public WeekDate nextDay()   
  17.             return TUES;  
  18.           
  19.         @Override  
  20.         public WeekDate preDay()   
  21.             return SUN;  
  22.           
  23.         @Override  
  24.         public String toString()   
  25.             return "WeekDate.MON";  
  26.           
  27.     ;    
  28.       
  29.     /** 
  30.      * 星期二 
  31.      */  
  32.     深入Java 1.5枚举类型的内部实现原理

    java 枚举类型 enum

    java高新技术-枚举

    java枚举类型学习

    深入浅出 Java 中枚举的实现原理

    Java枚举实现单例模式原理