Java枚举解读

来源:互联网 发布:淘宝面条机 编辑:程序博客网 时间:2024/06/16 10:40

先看下面的一段代码:

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方法。

 

0 0
原创粉丝点击