Java枚举解读

先看下面的一段代码:

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值