黑马程序员_Java枚举

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------


 

Blog_9_1枚举的作用

枚举的作用:限定变量的赋值规则,使得编译期间就能发现赋值的正确与否。

如:WeekDay weekday=Mon; WeekDayweekday=Tus; WeekDay weekday=Wes;

WeekDay weekday=Thr; WeekDay weekday=Fri; WeekDay weekday=Sta;WeekDay weekday=Sun。需求只能按照上述规定来赋值,这时枚举就派上用场了。

Blog_9_2用普通类来模拟枚举

下面用一个普通类加以改造,模拟枚举的功能和特征,使我们能从本质上理解枚举。

//构造方法私有化,只能在WeekDay类的内部创建其对象
   private WeekDay() {
   }
   final static WeekDay Mon = new WeekDay();
   final static WeekDay Sun = new WeekDay();
   public WeekDay nextDay() {
      if (this ==Mon) {
         return Sun;
      }else{
         return Mon;
      }
   }
   public String toString() {
      return (this ==Mon) ?"Mon" :"Sun";
   }
}

  分析:上面代码的做法,其实质是阻止外界创建WeekDay的对象,如果外界要使用WeekDay的对象,只能通过静态方法调用WeekDay内部创建的限定的对象。 上述做法只有两个对象,如果要求的限定对象很多时,而且要求每个限定对象都能调用自己的方法时,上述用法就不太合理了,这时我们需要在上面代码上进行一定的修改,加入抽象方法,并在匿名子类中实现。

public abstract class WeekDay {
   private WeekDay() {
 
   }
 
   final static WeekDay Mon = new WeekDay() {
      @Override
      public WeekDay nextDay() {
         return Sun;
      }
   };
   final static WeekDay Sun = new WeekDay() {
      @Override
      public WeekDay nextDay() {
         return Mon;
      }
   };
 
   public abstract WeekDay nextDay();
 
   public String toString() {
      return (this ==Mon) ?"Mon" :"Sun";
   }
}

Blog_9_3枚举的定义和使用

Blog_9_3_1枚举的定义

用模拟枚举的方法理解了枚举,下面就正式开始枚举的学习吧;使用关键字enum修饰类,然后在类体中写上枚举值,注意每一个枚举值之间用,号隔开,枚举值列表必须位于所有成员的前面如下:

public enum WeekDay {
   Mon, Tue,Wes,Thi,Fri,Sta,Sun;
}

Blog_9_3_1枚举的方法

主要掌握两个静态方法:

valueof(String)---将对应的枚举字符串还原为枚举对象

values()---将所有的枚举值存入一个数组,以便用来遍历。

      WeekDay weekDay = WeekDay.Mon;
      WeekDay[]warr1=weekDay.values();
      // 把字符串转换为枚举值得方法
      WeekDay w1 = WeekDay.valueOf("Sun");
      System.out.println(w1);
      // 将所有的枚举值存进一个数组中去,以便遍历使用
      WeekDay[]warr = WeekDay.values();
      for (WeekDay wd : warr) {
         System.out.println(wd);
      }

Blog_9_3带构造方法的枚举

如下面Mon()表示调用的是无参构造,Tue(1)表示的是调用带参构造,值得注意的是当使用静态方法WeekDay[] warr = WeekDay.values();相当于让所有的枚举值调用了无参构造。

注意:枚举值一定要位于所有的成员的前面。

public enum WeekDay {
   Mon(), Tue(1),Wes,Thi,Fri,Sta,Sun;
   private WeekDay(){
      System.out.println("无参构造");
   }
   private WeekDay(int num){
      System.out.println("带参数构造方法");
   }
}

Blog_9_4带有抽象方法的枚举

public enum TrafficLamp {
//调用无参构造
   Green {
      @Override
      public TrafficLamp nextLamp(){
         return Yellow;
      }
   },
//调用有参数构造的方法
   Yellow (100){
      @Override
      public TrafficLamp nextLamp(){
         return Red;
      }
   },
   Red {
      @Override
      public TrafficLamp nextLamp(){
         return Green;
      }
   };
   int time = 0;
//定义了一个抽象方法
   public abstract TrafficLamp nextLamp();
//枚举的构造方法需要私有
   private TrafficLamp() {
 
   }
   private TrafficLamp(int time) {
      this.time = time;
   }

总结:枚举的实质是使一个类的构造方法私有化,并在类中创建限定的对象,使得外界只能通过提供的静态方法使用这些限定的对象。

 

----------------------- android培训java培训、java学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.youkuaiyun.com/heima


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值