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是不能再继承其他类,不过它却可以实现一个或多个接口

  • 相关阅读:
    Double-Array Trie 原理解析
    LeetCode 之 Longest Valid Parentheses(栈)
    [Unity3D]Unity3D游戏开发之从Unity3D到Eclipse
    走进Struts2(一) — Struts2的执行流程及其工作原理
    网页页面NULL值对浏览器兼容性的影响
    基于cocos2d-x-3.2学习Box2D(一)
    记忆方法与高速阅读——什么是高速阅读
    ArcGIS 教程:Workflow Manager 高速浏览
    【cocos2d-x 3.7 飞机大战】 决战南海I (三) 敌机实现
    C语言事实上不简单:数组与指针
  • 原文地址:https://www.cnblogs.com/liupiao/p/9270901.html
Copyright © 2011-2022 走看看