黑马程序员技术交流社区

标题: 关于枚举型Enum的使用,有全乎一点的吗? [打印本页]

作者: ReFly    时间: 2013-11-9 00:09
标题: 关于枚举型Enum的使用,有全乎一点的吗?
关于java枚举型。是JDK1.5以后出现的。在基础班学了十多天,没得讲。自己查阅了一下API,API写的太简略,实在没能实际性的理解(最好有点小题那种)。求师兄师姐指教。。

作者: ysunday    时间: 2013-11-9 12:16
  1. //这是我从视频中抄写的代码
  2. public class Code01{
  3.     public static void main(String[] args){
  4.         WeekDay day = WeekDay.Sun;//就是说这里的day只能赋值
  5.                                   //WeeKday里边声明过的值
  6.         System.out.println(day);
  7.     }
  8. }

  9. //定义一个枚举

  10. public enum WeekDay{
  11.     Sun, Mon, Tue, Wen, Thu, Fri, Sat//这里可加;号,也可不加
  12.                                      //这几个元素都是WeekDay
  13.                                      //的一个对象
  14. }
复制代码
带构造函数的枚举
  1. public enum WeekDay{
  2.     Sun(1), Mon, Tue, Wen, Thu, Fri, Sat//默认是调用无参构造函数
  3.                                         //Sun(1)会调用WeekDay(1)
  4.     //默认会有一个无参构造函数,必须私有(如果你不定义,默认隐藏)
  5.     private WeekDay(){System.out.println(“default constructor”)}
  6.     //也可以自定义一个有参构造函数,必须私有
  7.     private WeekDay(int day){System.out.println(“constructor with argument”)}
  8. }
复制代码
带方法的枚举类   

step 1:写个枚举类
  1. <pre class="prettyprint">public enum TrafficLamp{
  2.         RED,GREEN;//记住定义元素的时候一定要写在第一行
  3. }</pre>
复制代码
step 2:定义个抽象方法,私有
  1. public enum TrafficLamp{
  2.         RED,GREEN;//记住定义元素的时候一定要写在第一行
  3.         private abstract TrafficLamp nextLamp();
  4. }
复制代码
step 3:因为每个对象都定义在类内部,则使用内部类完成对方法的实现
  1. public enum TrafficLamp{
  2.         RED{
  3.                 public TrafficLamp nextLamp(){return GREEN;}
  4.         },
  5.         GREEN{
  6.                 public TrafficLamp nextLamp(){return RED;}
  7.         };
  8.         private abstract TrafficLamp nextLamp();
  9. }
复制代码
带属性的枚举类(从上边的代码加上属性)
  1. public enum TrafficLamp{
  2.         RED(30){
  3.                 public TrafficLamp nextLamp(){return GREEN;}
  4.         },
  5.         GREEN(40){
  6.                 public TrafficLamp nextLamp(){return RED;}
  7.         };
  8.         private int minute;//加上属性
  9.         private TrafficLamp(int minute){//然后用构造
  10.                                         //方法传值
  11.                 this.minute = minute;
  12.         }
  13.         private abstract TrafficLamp nextLamp();
  14. }
复制代码

作者: ysunday    时间: 2013-11-9 12:18
建议你去看张孝祥老师的高新技术视频,里边有讲,上边是我抄的代码
作者: Lucking    时间: 2013-11-9 17:24
首先说下干嘛要用个枚举enum类型呢, 打个比方,你们家有个保险箱,比较高级,用令牌来开的,这种令牌当然不能多啦,你老婆有一个,你自己有一个就行了,没必要给你们家宠物街坊邻居都搞一个吧,这样你可以定义一个枚举类型的令牌public enum Passcard {wifePasscard, selfPasscard};里边的元素就两个,你和你老婆,其他都是非法的,开不了你家保险箱,这样就是定制了一款专属你们家的保险箱钥匙,在程序里就是专门定义了一种只有两种元素的数据类型,注意这里Passcard是一个类,你要用的时候需要定义一个Passcard类型的变量,如下
public class TestDemo {
        public enum Passcard {wifePasscard, selfPasscard};
       
        public static void main(String[] args) {
                Passcard pc = Passcard.wifePasscard;//定义Passcard变量pc,初始化为老婆的密码
               
                switch(pc) {
                case wifePasscard:
                        System.out.println("老婆的密码卡,通过验证~");
                        break;
                       
                case selfPasscard:
                        System.out.println("自己的密码卡,通过验证~");
                        break;
                       
                default:
                        System.out.println("非法,警告!");
                }
                System.out.println(pc);
        }
}
当然,我们完全可以用一个整数啊字符串啊或者其他什么类型的变量作为密码卡,但是因为卡只有两张(元素固定),单独定义成一种数据类型是不是更加清晰,使用起来,维护起来也更方便呢.
作者: 青年黨衛軍    时间: 2013-11-9 19:04
1.枚举定义:枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见。 例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY,就是一个枚举。 枚举的说明与结构和联合相似,其形式为:
  1. enum 枚举名
复制代码
2.枚举的主要用法
<1>常量
通过枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
  1. public   enum  Week
复制代码
<2>switch
switch语句中使用枚举,能让我们的代码可读性更强
  1. enum  Week
复制代码
<3>向枚举中添加新方法
如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum实例。
  1. public enum Week
  2. {  
  3.         SUNDAY("星期日" , 0), MONDAY("星期日" , 1), TUESDAY("星期日" , 2), WEDNESDAY("星期日" , 3),
  4.         THURSDAY("星期日" , 4), FRIDAY("星期日" , 5), SATURDAY("星期日" , 6);
  5.     // 成员变量   
  6.     private  String name;  
  7.     private   int  index;  
  8.     // 构造方法   
  9.     private  Week(String name,  int  index)
  10.     {  
  11.         this .name = name;  
  12.         this .index = index;  
  13.     }  
  14.     public  String getName()
  15.     {  
  16.         return  name;  
  17.     }  
  18.     public   void  setName(String name)
  19.     {  
  20.         this .name = name;  
  21.     }  
  22.     public   int  getIndex()
  23.     {  
  24.         return  index;  
  25.     }  
  26.     public   void  setIndex( int  index)
  27.     {  
  28.         this .index = index;  
  29.     }  
  30. }  
复制代码
<4>覆盖枚举的方法
toString()方法覆盖的例子
  1. public enum Week
  2. {  
  3.         SUNDAY("星期日" , 0), MONDAY("星期日" , 1), TUESDAY("星期日" , 2), WEDNESDAY("星期日" , 3),
  4.         THURSDAY("星期日" , 4), FRIDAY("星期日" , 5), SATURDAY("星期日" , 6);
  5.     // 成员变量   
  6.     private  String name;  
  7.     private   int  index;  
  8.     // 构造方法   
  9.     private  Week(String name,  int  index)
  10.     {  
  11.         this .name = name;  
  12.         this .index = index;  
  13.     }  
  14.     public  String toString()
  15.     {  
  16.         return   this .index+ "_" + this .name;  
  17.     }
  18. }  
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2