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

  • 相关阅读:
    《GDB常用基本》
    《Linux守护进程》
    <C语言知识点 —— 数组赋值字符串>
    《Linux知识点》
    玩转----select模块操作下拉框-selenium
    玩转----selenium--下拉框select
    玩转----selenium-滚动条的几种方式
    玩转----python-装饰器
    玩转----解决selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid 'expiry'
    玩转----iframe框架怎样来定位,并说明iframe框架中不变和可变的属性分别是什么?多个iframe框架怎么处理?iframe和frame区别:
  • 原文地址:https://www.cnblogs.com/liupiao/p/9270901.html
Copyright © 2011-2022 走看看