先看下面的一段代码:
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实例对象的话,那上面的代码就让人费解了,为什么枚举类型Color中的抽象方法,实例对象RED可以重写枚举类型的方法呢?
先看一下上面的方法的值吧!
public class TestColor { public static void main(String[] args) {
System.out.println(Color.RED.getName());//红色 System.out.println(Color.GREEN.getName());//绿色 System.out.println(Color.YELLOW.getName());//黄色
//class com.enumtest.test.Color$1 System.out.println(Color.RED.getClass()); //class com.enumtest.test.Color System.out.println(Color.RED.getClass().getSuperclass()); //class java.lang.Enum System.out.println(Color.RED.getClass(). getSuperclass().getSuperclass());
System.out.println(Color.class.getModifiers());//17409 System.out.println(Color.RED.getClass(). getClassLoader());//sun.misc.Launcher$AppClassLoader@5ab8df17 System.out.println(TestColor.class.getClassLoader());//sun.misc.Launcher$AppClassLoader@5ab8df17 System.out.println(ClassLoader.class.getClassLoader());//null System.out.println(Class.class.getClassLoader());//null } } |
从上面的测试结果可以看出,枚举类型类其实是Enum(抽象类)的一个子类(可以是抽象的,也可以是不抽象的,主要根据里面有没有抽象方法),然后枚举值是枚举类型的一个匿名子类创建的对象。其实可以这么解读:
RED{
public String getName(){
return"红色";
}
}
相当于下面这样:
publicstatic final Color RED = new Color(){
public String getName(){
return "红色";
}
}
所以Java编译器在就是按这种方式编译的,所以我们在调用Color.RED.getName()就是在调用Color.RED实例对象的getName方法。