黑马程序员---基础加强---8枚举

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

枚举
    枚举在java中是一种特殊的类型,在jdk1.5之后才有的,也是jdk1.5的一个新特性之一.java.lang.Enum是所有枚举的基类,枚举类和普通类不同,枚举由一个或者多个
    public static final的字段和私有构造函数组成.每个字段的类型都是枚举类型本身.枚举不能被程序员创建对象所以枚举的构造函数是私有的,枚举还是一个私有
    构造函数的抽象类,所以枚举不能被继承.枚举中的字段与其字段值或其他方法返回值都是程序在开发时设定好的,程序不能再编译或者执行时被复写修改传入非法的
    数据造成程序异常.这就是枚举类型,其他基本数据类型没有能在程序编译执行前报非法数据异常的能力,只有枚举才能实现这个功能,所以枚举也是jdk1.5其中的一
    个新特性.

那为什么要出现枚举呢?
    其实枚举这个概念早已经就有了,在计算机的叫早语言中如C语言或者C++中都有对枚举的定义和使用,当java中为了实现c语言中的相关功能,当时的sun公司号称java抛弃了C语言中
    很多臃肿的没用的技术,枚举就是其中一个,但是java经过多年的发展涉及的领域与越来越广泛,所有有些在C语言中被认为不常用而臃肿的东西又被重新使用了,就
    如枚举.在jdk1.5之前java还没有定义枚举时,程序员们常常要手动写一个有枚举功能的java普通类,比如我们在描述星期时会这么写:

  //定义一个枚举WeekDay
    public abstract class WeekDay{
 //星期一
 public static final WeekDay MON=new WeekDay(){
  //内部类,也是一个没有名称的子类
  //复写父类抽象方法nextDay()
  public WeekDay nextDay(){
   return TUS;
  }
 };
 //星期天
 public static final WeekDay SUN=new WeekDay(){
  public WeekDay nextDay(){
   return MON;
  }
 };
 //星期二
 public static final WeekDay TUS=new WeekDay(){
  public WeekDay nextDay(){
   return THREE;
  }
 };
 //星期三
 public static final WeekDay THREE=new WeekDay(){
  public WeekDay nextDay(){
   return THUR;
  }
 };
 //星期四
 public static final WeekDay THUR=new WeekDay(){
  public WeekDay nextDay(){
   return FRI;
  }
 };
 //星期五
 public static final WeekDay FRI=new WeekDay(){
  public WeekDay nextDay(){
   return SEX;
  }
 };
 //星期六
 public static final WeekDay SEX=new WeekDay(){
  public WeekDay nextDay(){
   return SUN;
  }
 };
 //私有化构造函数
 private WeekDay(){}
 //定义抽象nextDay方法
 public abstract WeekDay nextDay();
 //复写toString方法
 public String toString(){
  return this==MON?"MON":this==SUN?"SUN":this==TUS?"TUS":
   this==THREE?"THREE":this==THUR?"THUR":this==FRI?"FRI":"SEX";
 }
   }


   现实生活中我们经常会这么写代码来描述一件不会改变的事物,比如星期几 生日 年龄交通灯等等...于是我们的代码就变得重复而臃肿了,于是枚举在jdk.5版本
   里就被重新使用了,用enum关键字类定义一个枚举类,程序员可以省去写abstract  public static fianl等繁琐的代码了,这也符合java的封装原则.所以枚举基于
   出现了.


枚举的基本性质都有哪些?
   那么枚举的基本性质都有哪些呢?
   1, 首先枚举本身是一种java类,其基类都是Enum,而Enum继承着Object根类.枚举也是一个抽象类,枚举中可以定义抽象方法.枚举不能被继承不能被程序员创建对象,
      因为枚举中的字段和方法不能被复写或修改,所以枚举类是不能被其他类继承的.他就是一个最终类final class.
   2, 枚举中的字段都是public static final特性,是枚举类本身的类型.每个字段之间有一个","号隔开,最后一个字段后面的","可以省略掉,整个字段的最后要有一
      个";"结束符号.如果字段要创建枚举内部类的话就在字段后加上"{}"符号,如果每个对象在创建时要调用含有参数的构造函数,那么可以在字段后"{}"前加"(Object obj)"
      代码,如:

 


   现实生活中我们经常会这么写代码来描述一件不会改变的事物,比如星期几 生日 年龄交通灯等等...于是我们的代码就变得重复而臃肿了,于是枚举在jdk.5版本
   里就被重新使用了,用enum关键字类定义一个枚举类,程序员可以省去写abstract  public static fianl等繁琐的代码了,这也符合java的封装原则.所以枚举基于
   出现了.


枚举的基本性质都有哪些?
   那么枚举的基本性质都有哪些呢?
   1, 首先枚举本身是一种java类,其基类都是Enum,而Enum继承着Object根类.枚举也是一个抽象类,枚举中可以定义抽象方法.枚举不能被继承不能被程序员创建对象,
      因为枚举中的字段和方法不能被复写或修改,所以枚举类是不能被其他类继承的.他就是一个最终类final class.
   2, 枚举中的字段都是public static final特性,是枚举类本身的类型.每个字段之间有一个","号隔开,最后一个字段后面的","可以省略掉,整个字段的最后要有一
      个";"结束符号.如果字段要创建枚举内部类的话就在字段后加上"{}"符号,如果每个对象在创建时要调用含有参数的构造函数,那么可以在字段后"{}"前加"(Object obj)"
      代码,如:

//创建枚举内部类
      public enum TraffictLight {
           RED{
                //枚举TraffictLight的内部类
           };
      }
      //创建内部类同时调用有参构造函数
      public enum TraffictLight {
           //调用含有参的构造函数
           RED(int time){
                //枚举TraffictLight的内部类
           };
      }


    3, 枚举中可以含有抽象方法,因为枚举本身就是抽象类.一旦枚举中含有抽象方法,那么在字段创建内部类的时候一定要实现该抽象方法.
       枚举重也可以定义实现方法.比如枚举都要复写父类的toString()方法.

    4,枚举是final的抽象类,所以枚举不能被继承,字段也不能再赋新值.


枚举的应用实例:
    枚举在我们生活中到处都有应用,比如描星期等,下面我们将上面我们自手动编写星期的有枚举功能的代码用枚举来写出来,修改后的代码如下:

 


    3, 枚举中可以含有抽象方法,因为枚举本身就是抽象类.一旦枚举中含有抽象方法,那么在字段创建内部类的时候一定要实现该抽象方法.
       枚举重也可以定义实现方法.比如枚举都要复写父类的toString()方法.

    4,枚举是final的抽象类,所以枚举不能被继承,字段也不能再赋新值.


枚举的应用实例:
    枚举在我们生活中到处都有应用,比如描星期等,下面我们将上面我们自手动编写星期的有枚举功能的代码用枚举来写出来,修改后的代码如下:

    //定义一个枚举WeekDay
    public  enum WeekDay{
 //星期一
 MON{
  //内部类,也是一个没有名称的子类
  //复写父类抽象方法nextDay()
  public WeekDay nextDay(){
   return TUS;
  }
 },
 //星期天
 SUN{
  public WeekDay nextDay(){
   return MON;
  }
 },
 //星期二
 TUS{
  public WeekDay nextDay(){
   return THREE;
  }
 },
 //星期三
 THREE{
  public WeekDay nextDay(){
   return THUR;
  }
 },
 //星期四
 THUR{
  public WeekDay nextDay(){
   return FRI;
  }
 },
 //星期五
 FRI{
  public WeekDay nextDay(){
   return SEX;
  }
 },
 //星期六
 SEX{
  public WeekDay nextDay(){
   return SUN;
  }
 },;//最后的","符号可以省略掉
 //定义抽象nextDay方法
 public abstract WeekDay nextDay();
 //复写toString方法
 public String toString(){
  return this==MON?"MON":this==SUN?"SUN":this==TUS?"TUS":
   this==THREE?"THREE":this==THUR?"THUR":this==FRI?"FRI":"SEX";
 }
    }
  
    经过使用枚举来创建的星期类是不是简单多啦.这是枚举的一个简单的应用,下面我们来看交通灯系统吧,这是一个较为复杂的应用了:
   
     public enum TraffictLight {
 RED (30){
  @Override
  public TraffictLight nextLifht() {
   return GREEN;
  }
 },YELLOW(5) {
  @Override
  public TraffictLight nextLifht() {
   return RED;
  }
 },GREEN(40) {
  @Override
  public TraffictLight nextLifht() {
   return YELLOW;
  }
 };
 public abstract TraffictLight nextLifht();
 public String toString(){
  return this==RED?"RED":this==YELLOW?"YELLOW":"GREEN";
 }
 //定义一个时间
 private int time;
 private TraffictLight(int time){this.time=time;}
 public int getTime(){
  return this.time;
 }
    }



    这是枚举较为复杂的应用,字段不仅在创建内部类的同时还调用的含有不同参数的私有构造函数来给time属性赋值.枚举在生活中被广泛应用,也是出于它特有的性质决定的.
    枚举在其他方面也被广泛应用,这里就不一一列举了.希望这编博客在各位网友学习枚举时能帮上一点点忙,这是我个人对枚举的学习笔记.

    这是枚举较为复杂的应用,字段不仅在创建内部类的同时还调用的含有不同参数的私有构造函数来给time属性赋值.枚举在生活中被广泛应用,也是出于它特有的性质决定的.
    枚举在其他方面也被广泛应用,这里就不一一列举了.希望这编博客在各位网友学习枚举时能帮上一点点忙,这是我个人对枚举的学习笔记.


---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值