黑马程序员之Java--枚举类型

来源:互联网 发布:质量控制系统 php 编辑:程序博客网 时间:2024/04/29 23:33
------- android培训、java培训、期待与您交流! ----------

枚举类型是JDK5.0的新特性,也是一个特殊的类

现在定义个枚举
public enum Color{ RED,BLUE,BLACK,YELLOW,GREEN  }

编译后成字节码文件,查看一下
  1. final enum hr.test.Color {  
  2.     
  3.  // 所有的枚举值都是类静态常量  
  4.  public static final enum hr.test.Color RED;  
  5.  public static final enum hr.test.Color BLUE;  
  6.  public static final enum hr.test.Color BLACK;  
  7.  public static final enum hr.test.Color YELLOW;  
  8.  public static final enum hr.test.Color GREEN;  
  9.    
  10. private static final synthetic hr.test.Color[] ENUM$VALUES;  
  11.     
  12.   // 初始化过程,对枚举类的所有枚举值对象进行第一次初始化  
  13.  static {  
  14.        0  new hr.test.Color [1]   
  15.       3  dup  
  16.       4  ldc <String "RED"> [16]  
  17.       6  iconst_0  
  18.       7  invokespecial hr.test.Color(java.lang.String, int) [17]  
  19.      10  putstatic hr.test.Color.RED : hr.test.Color [21]     
  20.       .........  枚举对象BLUE等与上同  
  21.     102  return  
  22. };  
  23.     
  24.   // 私有构造器,外部不可能动态创建一个枚举类对象(也就是不可能动态创建一个枚举值)。  
  25.  private Color(java.lang.String arg0, int arg1){  
  26.      // 调用父类Enum的受保护构造器创建一个枚举对象  
  27.      3  invokespecial java.lang.Enum(java.lang.String, int) [38]  
  28. };  
  29.    
  30.  public static hr.test.Color[] values();  
  31.     
  32.    // 实现Enum类的抽象方法    
  33.   public static hr.test.Color valueOf(java.lang.String arg0);  
  34. }   
从字节码文件中可以得知:
枚举的构造方法必须是私有的,不对外提供构造,构造器只是在构造枚举的时候被调用;
默认是调用无参的构造器,也可提供有参的构造器
枚举值必须在构造器的前面,且必须有分号结束;
所有枚举值都是静态常量,且是Color的对象;
枚举类是final,是不可被继承的

枚举内部调用构造器,下面是带参数的构造器
  1. enum Color{  
  2.                 RED(255,0,0),BLUE(0,0,255),BLACK(0,0,0),YELLOW(255,255,0),GREEN(0,255,0);  
  3.                 //构造枚举值,比如RED(255,0,0)  
  4.                 private Color(int rv,int gv,int bv){  
  5.                  this.redValue=rv;  
  6.                  this.greenValue=gv;  
  7.                  this.blueValue=bv;  
  8.                 }  
  9.   
  10.                 public String toString(){  //覆盖了父类Enum的toString()  
  11.                      return super.toString()+"("+redValue+","+greenValue+","+blueValue+")";  
  12.                 }  
  13.      
  14.                 private int redValue;  //自定义数据域,private为了封装。  
  15.                 private int greenValue;  
  16.                 private int blueValue;  
  17.  }   

枚举就是一个特殊的类,那么枚举中也可以有方法,用交通灯演示,红灯 下一个就是 绿灯,绿灯下一个是黄灯,黄灯下一个就是红灯(内部类)
enum LampLight{    RED{        @Override        public LampLight next() {                        return GREEN;        }    },YELLOW{        @Override        public LampLight next() {             return RED;        }    },GREEN{        @Override        public LampLight next() {             return YELLOW;        }    };    public abstract LampLight next();//抽象方法,让枚举值各自实现}

枚举调用:
public class Test{     public static void main(String[] args){         Color c= Color.RED;         System.out.println(c);            LampLight l = LampLight.RED;        System.out.println( l.next()); //输出 GREEN    }}

所有枚举类型都继承自Enum,其方法也可被使用
1、 ordinal()方法: 返回枚举值在枚举中的顺序,这个根据枚举值声明的顺序而定
   Color.RED.ordinal();  //返回结果:0
    Color.GREEN.ordinal();  //返回结果:4

2、compareTo()方法:枚举实现了比较器接口,可以比较对象和指定对象的顺序,前提是两个枚举值必须是同个枚举类型

3、values()方法:静态方法,返回一个包含枚举值的数组

4、 toString()方法:返回枚举常量的名称

5.、valueOf()方法:这个和toString()对应,根据指定名称返回枚举类型的枚举常量

6、equals()方法:比较两个枚举对象的引用,这个还是使用object的方法

枚举在switch中的使用:
一般都是Color c = Color.RED;而在switch中比较特殊,不需要前面的枚举类型,直接是枚举值
switch( c){  case RED:         break;  default:       break;}


------- android培训、java培训、期待与您交流! ----------

0 0
原创粉丝点击