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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 任亚俊 中级黑马   /  2013-12-24 03:32  /  1305 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

昨天看了张老师的交通灯管理系统,对枚举不是很理解。
1.枚举中可以有构造方法,可以有普通方法,枚举与类的关系是什么呢?
2.枚举和类有啥区别呢?
3.什么时候用枚举比类好呢?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

5 个回复

正序浏览
Enum
作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接

口。当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征。
1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。
2.所有枚举值都是public  , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义变量一样定义其它任何类

型的非枚举变量,这些变量可以用任何你想用的修饰符。
3.Enum默认实现了java.lang.Comparable接口。
4.Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.   
5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己

重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。
6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。
7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里

Color.Red.ordinal()返回0。


1.遍历所有有枚举值
知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。  
for (Color  c: Color.values()) System.out.println(“find value:” + c);

2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
其实枚举就是一个类,只不过在这里里面定义了很多的他自己的东西,当你需要使用枚举的时候,你就直接用它里面的东西就可以了,或者自己在定义一个枚举的时候自己定义一些东西,然后用的时候,就只能用这个里面。
类里面可以有构造方法,那么枚举里面当然也是如此了,但是不能对原来的枚举类直接操作,所以定义为了private类型,这样是保护里面的数据不被修改。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
  1. public class TestEnum {
  2.     /*最普通的枚举*/
  3.     public enum ColorSelect {
  4.         red, green, yellow, blue;   
  5.     }

  6.     /* 枚举也可以象一般的类一样添加方法和属性,你可以为它添加静态和非静态的属性或方法,这一切都象你在一般的类中做的那样. */
  7.     public enum Season {
  8.         // 枚举列表必须写在最前面,否则编译出错
  9.         winter, spring, summer, fall;

  10.         private final static String location = "Phoenix";        

  11.         public static Season getBest() {
  12.             if (location.equals("Phoenix"))
  13.                 return winter;
  14.             else
  15.                 return summer;
  16.         }
  17.     }
  18.     /*还可以有构造方法*/
  19.     public enum Temp {
  20.         /*通过括号赋值,而且必须有带参构造器和一属性跟方法,否则编译出错
  21.          * 赋值必须是都赋值或都不赋值,不能一部分赋值一部分不赋值
  22.          * 如果不赋值则不能写构造器,赋值编译也出错*/
  23.         absoluteZero(-459), freezing(32),boiling(212), paperBurns(451);
  24.         
  25.         private final int value;
  26.         public int getValue() {
  27.             return value;
  28.         }
  29.         //构造器默认也只能是private, 从而保证构造函数只能在内部使用
  30.         Temp(int value) {
  31.             this.value = value;
  32.         }
  33.     }

  34.     public static void main(String[] args) {
  35.         /*
  36.          * 枚举类型是一种类型,用于定义变量,以限制变量的赋值 赋值时通过"枚举名.值"来取得相关枚举中的值
  37.          */
  38.         ColorSelect m = ColorSelect.blue;
  39.         switch (m) {
  40.         /*注意:枚举重写了ToString(),说以枚举变量的值是不带前缀的
  41.           *所以为blue而非ColorSelect.blue
  42.           */
  43.    case red:
  44.             System.out.println("color is red");
  45.             break;
  46.         case green:
  47.             System.out.println("color is green");
  48.             break;
  49.         case yellow:
  50.             System.out.println("color is yellow");
  51.             break;
  52.         case blue:
  53.             System.out.println("color is blue");
  54.             break;
  55.         }
  56.         System.out.println("遍历ColorSelect中的值");
  57.         /*通过values()获得枚举值的数组*/
  58.         for (ColorSelect c : ColorSelect.values()) {
  59.             System.out.println(c);
  60.         }   
  61.    System.out.println("枚举ColorSelect中的值有:"+ColorSelect.values().length+"个");
  62.   /*ordinal()返回枚举值在枚举中的索引位置,从0开始*/
  63.   System.out.println(ColorSelect.red.ordinal());//0
  64.   System.out.println(ColorSelect.green.ordinal());//1
  65.   System.out.println(ColorSelect.yellow.ordinal());//2
  66.   System.out.println(ColorSelect.blue.ordinal());//3

  67.   /*枚举默认实现了java.lang.Comparable接口*/
  68.   System.out.println(ColorSelect.red.compareTo(ColorSelect.green));

  69.   System.out.println(Season.getBest());
  70.         
  71.         for(Temp t:Temp.values()){
  72.             /*通过getValue()取得相关枚举的值*/
  73.             System.out.println(t+"的值是"+t.getValue());
  74.         }

  75.     }
  76. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
参考资料:
Java的枚举的基本应用(枚举的入门)

Public enum WeekDay{

         SUN,MON,THE,WED,THU,FRI,SAT
}

枚举相当于一个类,而枚举类的一个值相当于该类的一个实例对象
如,可以把WeekDay看成一个类,SUN就是WeekDay的一个实体对象了。

枚举的方法:      
        
         WeekDay weekday  = WeekDay.SUN;

weekday.name();//获取当前枚举对象的名称   ——SUN
weekday.ordinal();//获取当前对象在枚举中的序列,从0开始

WeekDay.valueOf(“FRI”);  //把一个字符串转换为一个枚举的对象
WeekDay.valuds();  //获得枚举中所有的对象的值,返回一个数组,输出如下

for(WeekDay day:WeekDay.values()){
                           
           System.out.println(day);
}




实现带有构造方法的枚举

publc enum WeekDay{
         SUN,MON(5),THE,WED,THU,FRI,SAT;
         private WeekDay();
         private WeekDay(int day);

}

构造方法必须是私有的,且放在所有枚举元素的后面。构造方法可带参数。


实现带有抽象方法的枚举
   public enum TrafficLamp{
  
  
  RED(30){               //子类调用父类带有一个参数的构造方法
   public TrafficLamp nextLamp() {      
                         //为了创建TrafficLamp的实例对象指向RED,先实现TrafficLamp的抽象方法。
    return GREEN;
   }},
   GREEN(50){
    public TrafficLamp nextLamp(){
     return  YELLOW;
    }
   },
   YELLOW(5){
    public TrafficLamp nextLamp(){     
     return RED;
    }
   };
  
  
  public abstract TrafficLamp nextLamp();   //抽象方法
  private int time;
  
  private TrafficLamp(int time){this.time = time;}
  
}
//枚举交通灯TrafficLamp 的元素实例有3个:RED,GREEN,YELLOW.
//当枚举中只有一个元素的时候,它是单例模式。  

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
    枚举类型其实就是一个类,只不过很多细节由编译器帮你补齐了,所以,某种程度上enum关键词的作用就像是class或interface.
  当使用enum定义枚举类型时,实际上所定义出来的类型是继承自java.lang.Enum类。而每个被枚举的成员其实就是定义的枚举类型的一个实例,它们都被默认为final。
      枚举类型既然是类,那么也就可以有构造函数。只不过不得有公开(Public)的构造函数,这是为了避免直接对枚举类型实例化

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马