zoukankan      html  css  js  c++  java
  • 枚举

    枚举

    enum:关键字enum可以将一组具名的值的有限集合创建成为一种新的类型。

    1.枚举的简单使用

     1 enum EnumDemo{
     2     RED,YELLOW,GREEN //enum实例
     3 }
     4 
     5 public class EnumClass {
     6     
     7     public static void main(String[] args) {
     8         for (EnumDemo s : EnumDemo.values()) {
     9             System.out.println(s+" ordinal "+s.ordinal());
    10             System.out.println(s.getDeclaringClass());//属于的enm类
    11             System.out.println(s.name());
    12             System.out.println("----------");
    13         }
    14     }
    15 
    16 }

     结果输出:

    RED ordinal 0
    class EnumDemo
    RED
    ----------
    YELLOW ordinal 1
    class EnumDemo
    YELLOW
    ----------
    GREEN ordinal 2
    class EnumDemo
    GREEN
    ----------

    从结果可能觉得很奇怪,定义了一个枚举,如果把它看做一个类的话,为什么可以调用values()、ordinal()方法,这些方法我们自己从未定义。这些方法哪里来的呢?实际上是在创建枚举的时候,编译器为我们生成一个相关的类,这个类继承了java.lang.Enum类,这个类提供许多方法。enum除了不能被继承之外,基本上可以将enum看做一个常规的类,我们也可以在enum中添加方法,enum甚至可以有main方法。不过在向enum添加方法前必须在实例序列的最后添加一个分号,同时要求必须先定义enum实例,在定义实例之前定义任何方法和属性都是引起编译报错

    2.在switch中使用enum

    一般来说,在switch中只能使用整数值,枚举实例天生具备整数值次序,并且可以通过ordinal()方法获取其次序。在Thinking in java中有一个经典的例子:

     1 enum Signal{
     2     RED,YELLOW,GREEN;
    3 } 4 public class TrafficLight { 5 Signal color = Signal.RED; 6 public void change(){ 7 switch (color) { 8 case RED: 9 color = Signal.GREEN; 10 break; 11 case GREEN: 12 color = Signal.YELLOW; 13 break; 14 case YELLOW: 15 color = Signal.RED; 16 } 17 } 18 19 public String toString(){ 20 return "The traffic light is " +color; 21 } 22 public static void main(String[] args) { 23 TrafficLight t = new TrafficLight(); 24 for(int i=0;i<3;i++){ 25 System.out.println(t); 26 t.change(); 27 } 28 } 29 30 }

    结果输出:

    The traffic light is RED
    The traffic light is GREEN
    The traffic light is YELLOW

    3.values()的特殊之处

    编译器会为我们创建enum类,并且这个类继承Enum类,查看源码发现Enum中并没有values()方法,那么values()哪里来的?以及生成的类到底是什么样子呢。通过javap 反编译字节码文件就可以看到相关的属性和行为。

    可以看出values是是编译器插入到生成的类中的一个静态方法,并不是继承来自Enum类,同时编译器还添加了valueOf()方法,这个方法与Enum中的valueOf方法重名,参数不一样。由于java的单继承机制,enum是不能再继承其他类,不过它却可以实现一个或多个接口

  • 相关阅读:
    centos已经安装了python2,同时安装python3
    linux下判断磁盘是ssd还是hdd
    Java中如何判断两个对象是否相等
    NPOI导出Excel和基于office导出Excel比较
    asp
    又找到了一个blog
    关于宋朝及中国历史的一点想法
    Android中实现EditText圆角
    Python小练习
    软件架构设计(三) 架构、架构师和架构设计
  • 原文地址:https://www.cnblogs.com/liupiao/p/9270901.html
Copyright © 2011-2022 走看看