10. jvm之枚举

一. 枚举的概念

enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。

二. 枚举的深度理解

1. 定义常量

enum Color{
    WHITE,BLACK,RED
}

2. 使用方式

System.out.println(Color.BLACK);

3. Color的本质

System.out.println(Color.class);
//class com.kevin.Color

说明Color实际为一个class

4. Color的父类

System.out.println(Color.class.getSuperclass());
//class java.lang.Enum

说明定义的枚举类的父类均为java.lang.Enum类

5. Color.BLACK的本质

System.out.println(Color.BLACK.getClass());
//class com.kevin.Color

说明Color.BLACK实际为一个Color 类的class实例,使用该实例可以像正常的对象一样调用方法及属性.

6. 总结

枚举为一个继承自java.lang.Enum的只可在内部进行实例化的类;平时使用的每个变量(Color.RED)返回的均为该Color的一个实例,通过该实例可像正常的实例一样调用方法。

三. 枚举的方法

  • Color.values():返回enum实例
  • Color.RED.name():返回定义的变量名(具体应该为类的实例名)
  • Color.RED.ordinal():返回该变量定义的次序,从0开始
  • Color.valueOf(String name):通过传入名字,返回实例变量

四. 枚举的高级使用

1. 创建构造方法

enum Color{
    WHITE("白色"),BLACK("黑色"),RED("红色");
    public String desc ;
    Color(String desc){
        this.desc = desc;
    }
}
  • 即使构造方法为public,使用new Color("蓝色")对Color实例化时,也会报错"Error:(14, 28) java: 无法实例化枚举类型"
  • 可使用Color.Red.desc获取desc属性,与普通类完全一致,而且desc不能声明为private
  • 使用Color.values()遍历时,声明对象若是Enum,不能获取到desc属性,必须是Color

2. 枚举方法

在上面的例子中添加方法getDesc

public String getDesc(){
    return this.desc;
}
  • 可以像普通方法一样的调用该方法Color.RED.getDesc()
  • 由于Color实际也是一个class,所以也可覆盖父类的方法

转自:
http://www.jb51.net/article/83104.htm
http://blog.csdn.net/wgw335363240/article/details/6359614