A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李有 中级黑马   /  2012-12-1 13:22  /  1141 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

谁能清楚地跟我讲讲枚举,比如什么是枚举,在jdk1点几的时候出现,具体有什么用,里面的构造函数的定义是什么意思。。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

2 个回复

正序浏览
枚举类型是JDK5.0的新特征。Sun引进了一个全新的关键字enum来定义一个枚举类。下面就是一个典型枚举类型的定义:
  1. public enum Color{  
  2.     RED,BLUE,BLACK,YELLOW,GREEN  
  3. }  
复制代码
显然,enum很像特殊的class,实际上enum声明定义的类型就是一个类。而这些类都是类库中Enum类的子类(java.lang.Enum<E>)。它们继承了这个Enum中的许多有用的方法。下面我们就详细介绍enum定义的枚举类的特征及其用法。(后面均用Color举例)

1、Color枚举类是特殊的class,其枚举值(RED,BLUE...)是Color的类对象(类实例):
                      Color c=Color.RED;
    而且这些枚举值都是public static final的,也就是我们经常所定义的常量方式,因此枚举类中的枚举值最好全部大写。

2、即然枚举类是class,当然在枚举类型中有构造器,方法和数据域。但是,枚举类的构造器有很大的不同:
      (1) 构造器只是在构造枚举值的时候被调用。
  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.               public String toString(){  //自定义的public方法  
  10.                return super.toString()+"("+redValue+","+greenValue+","+blueValue+")";  
  11.                 }  
  12.   
  13.               private int redValue;  //自定义数据域,private为了封装。  
  14.                 private int greenValue;  
  15.                private int blueValue;  
  16. }  
复制代码
(2) 构造器只能私有private,绝对不允许有public构造器。这样可以保证外部代码无法新构造枚举类的实例。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。 但枚举类的方法和数据域可以允许外部访问。
  1. public static void main(String args[])  
  2. {  
  3.         // Color colors=new Color(100,200,300);  //wrong  
  4.           Color color=Color.RED;  
  5.            System.out.println(color);  // 调用了toString()方法  
  6. }   
复制代码
3、所有枚举类都继承了Enum的方法,下面我们详细介绍这些方法。
       (1)  ordinal()方法: 返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。
                 Color.RED.ordinal();  //返回结果:0
                 Color.BLUE.ordinal();  //返回结果:1
       (2)  compareTo()方法: Enum实现了java.lang.Comparable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出ClassCastException()异常。(具体可见源代码)
                 Color.RED.compareTo(Color.BLUE);  //返回结果 -1
       (3)  values()方法: 静态方法,返回一个包含全部枚举值的数组。
                 Color[] colors=Color.values();
                 for(Color c:colors){
                        System.out.print(c+",");
                 }//返回结果:RED,BLUE,BLACK YELLOW,GREEN,
       (4)  toString()方法: 返回枚举常量的名称。
                 Color c=Color.RED;
                 System.out.println(c);//返回结果: RED
       (5)  valueOf()方法: 这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。
                 Color.valueOf("BLUE");   //返回结果: Color.BLUE
       (6)  equals()方法: 比较两个枚举类对象的引用。
  1. //JDK源代码:      
  2. public final boolean equals(Object other) {  
  3.        return this==other;  
  4. }
复制代码
4、枚举类可以在switch语句中使用。
  1. Color color=Color.RED;  
  2. switch(color){  
  3.        case RED: System.out.println("it's red");break;  
  4.        case BLUE: System.out.println("it's blue");break;  
  5.         case BLACK: System.out.println("it's blue");break;  
  6. }
复制代码
回复 使用道具 举报
DK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便。 用法一:常量    在JDK1.5 之前,我们定义常量都是: publicstaticfianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

Java代码

  • public enum Color {  
  •   RED, GREEN, BLANK, YELLOW  
  • }  

public enum Color {  RED, GREEN, BLANK, YELLOW}
用法二:switch    JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。

Java代码

  • enum Signal {  
  •     GREEN, YELLOW, RED  
  • }  
  • public class TrafficLight {  
  •     Signal color = Signal.RED;  
  •     public void change() {  
  •         switch (color) {  
  •         case RED:  
  •             color = Signal.GREEN;  
  •             break;  
  •         case YELLOW:  
  •             color = Signal.RED;  
  •             break;  
  •         case GREEN:  
  •             color = Signal.YELLOW;  
  •             break;  
  •         }  
  •     }  
  • }  

enum Signal {        GREEN, YELLOW, RED}public class TrafficLight {        Signal color = Signal.RED;        public void change() {                switch (color) {                case RED:                        color = Signal.GREEN;                        break;                case YELLOW:                        color = Signal.RED;                        break;                case GREEN:                        color = Signal.YELLOW;                        break;                }        }}

用法三:向枚举中添加新方法    如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。

Java代码

  • public enum Color {  
  •     RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
  •     // 成员变量  
  •     private String name;  
  •     private int index;  
  •     // 构造方法  
  •     private Color(String name, int index) {  
  •         this.name = name;  
  •         this.index = index;  
  •     }  
  •     // 普通方法  
  •     public static String getName(int index) {  
  •         for (Color c : Color.values()) {  
  •             if (c.getIndex() == index) {  
  •                 return c.name;  
  •             }  
  •         }  
  •         return null;  
  •     }  
  •     // get set 方法  
  •     public String getName() {  
  •         return name;  
  •     }  
  •     public void setName(String name) {  
  •         this.name = name;  
  •     }  
  •     public int getIndex() {  
  •         return index;  
  •     }  
  •     public void setIndex(int index) {  
  •         this.index = index;  
  •     }  
  • }  

public enum Color {        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);        // 成员变量        private String name;        private int index;        // 构造方法        private Color(String name, int index) {                this.name = name;                this.index = index;        }        // 普通方法        public static String getName(int index) {                for (Color c : Color.values()) {                        if (c.getIndex() == index) {                                return c.name;                        }                }                return null;        }        // get set 方法        public String getName() {                return name;        }        public void setName(String name) {                this.name = name;        }        public int getIndex() {                return index;        }        public void setIndex(int index) {                this.index = index;        }}

用法四:覆盖枚举的方法    下面给出一个toString()方法覆盖的例子。

Java代码

  • public enum Color {  
  •     RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
  •     // 成员变量  
  •     private String name;  
  •     private int index;  
  •     // 构造方法  
  •     private Color(String name, int index) {  
  •         this.name = name;  
  •         this.index = index;  
  •     }  
  •     //覆盖方法  
  •     @Override  
  •     public String toString() {  
  •         return this.index+"_"+this.name;  
  •     }  
  • }  

public enum Color {        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);        // 成员变量        private String name;        private int index;        // 构造方法        private Color(String name, int index) {                this.name = name;                this.index = index;        }        //覆盖方法        @Override        public String toString() {                return this.index+"_"+this.name;        }}
用法五:实现接口所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。

Java代码

  • public interface Behaviour {  
  •     void print();  
  •     String getInfo();  
  • }  
  • public enum Color implements Behaviour{  
  •     RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
  •     // 成员变量  
  •     private String name;  
  •     private int index;  
  •     // 构造方法  
  •     private Color(String name, int index) {  
  •         this.name = name;  
  •         this.index = index;  
  •     }  
  • //接口方法  
  •     @Override  
  •     public String getInfo() {  
  •         return this.name;  
  •     }  
  •     //接口方法  
  •     @Override  
  •     public void print() {  
  •         System.out.println(this.index+":"+this.name);  
  •     }  
  • }  

public interface Behaviour {        void print();        String getInfo();}public enum Color implements Behaviour{        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);        // 成员变量        private String name;        private int index;        // 构造方法        private Color(String name, int index) {                this.name = name;                this.index = index;        }//接口方法        @Override        public String getInfo() {                return this.name;        }        //接口方法        @Override        public void print() {                System.out.println(this.index+":"+this.name);        }}
用法六:使用接口组织枚举
Java代码

  • public interface Food {  
  •     enum Coffee implements Food{  
  •         BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO  
  •     }  
  •     enum Dessert implements Food{  
  •         FRUIT, CAKE, GELATO  
  •     }  
  • }  

public interface Food {        enum Coffee implements Food{                BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO        }        enum Dessert implements Food{                FRUIT, CAKE, GELATO        }}
用法七:关于枚举集合的使用java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马