黑马程序员-复习笔记之枚举

来源:互联网 发布:兰空voez知乎 编辑:程序博客网 时间:2024/05/01 23:17

------- android培训、java培训、期待与您交流! ----------

//高新技术之枚举

*为什么要有枚举:
 问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,
 但有人可能会写成int weekday=0;
 
 枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器
 就会报错,枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量
 方式在开发阶段无法实现这一目标。

*用普通类如何实现枚举功能,定义一个WeekDay的类来模拟枚举的功能。
 *私有的构造方法
 *每个元素分别用一个工友的静态成员变量表示
 *可以有若干公有方法或抽象方法,例如:要提供nextDay方法必须是抽象的。采用抽象
 方法定义nextDay就将大量的if else语句转成了一个个独立的类。

代码:
package cn.itheima;

public class EnumTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  WeekDay weekDay = WeekDay.MON;
  System.out.println(weekDay.nextDay());
  //用普通的java类来实现枚举的原理。
 }

}

package cn.itcast.day1;

public abstract class WeekDay {
 private WeekDay(){}
 
 public final static WeekDay SUN =new WeekDay(){

  @Override
  public WeekDay nextDay() {
   // TODO Auto-generated method stub
   return MON;
  }
  
 };//创建WeekDay子类(抽象方法覆盖)的匿名内部类。
 public final static WeekDay MON =new WeekDay(){

  @Override
  public WeekDay nextDay() {
   // TODO Auto-generated method stub
   return SUN;
  }
  
 };
 
 public abstract WeekDay nextDay();
 //把nextDay中大量if else语句转成了一个个独立的类。
 
 /*public WeekDay nextDay(){
  if(this == SUN){
   return MON;
  }else{
   return SUN;
  }
 }*/
 public String toString(){
  
  return this ==SUN?"SUN":"MON";
  
 }

}

 


*枚举的基本应用
 *举例:定义一个WeekDay的枚举
 *扩展:枚举的values,valueOf.name.toString.ordinal等方法
 *总结:枚举是一个特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用
  WeekDay SUN.getClass().getName()和WeekDay.class.getName().
 *枚举只有一个成员时,就可以作为一种单例的实现方式。

代码:(枚举的基本应用。带有构造方法的枚举。实现带有抽象方法的枚举)
package cn.itcast.day1;

public class EnumTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  WeekDay1 weekDay = WeekDay1.MON;
  System.out.println(weekDay.nextDay());
  //用普通的java类来实现枚举的原理。
  
  WeekDay weekDay2 = WeekDay.FRI;
  System.out.println(weekDay2);
  System.out.println(weekDay2.name());
  System.out.println(weekDay2.ordinal());
  System.out.println(WeekDay.valueOf("SUN").toString());
  //valueOf()吧传进来的"SUN"变成对象
  System.out.println(WeekDay.values().length);
  //返回一个数组。可以遍历数组查看所有枚举元素。
 }
 public enum WeekDay{//enum定义枚举的关键字
  //枚举就是一个类,枚举的元素就是这个类的实例对象。
  //public WeekDay();//定义所有的东西都必须在元素列表之后
  SUN(1),MON(),TUE,WED,THI,FRI,SAT;
  private WeekDay(){System.out.println("first");}//定义所有的东西都必须在元素列表之后,构造方法必须是私有。
  private WeekDay(int day){System.out.println("second");}
  //只要用到枚举类,静态都会执行,构造方法都调用了,"first"
  //我在用到枚举类是,会调用第二个构造方法,就在原属后面传一个参数。如果SUN(1)
  //在枚举元素后面跟上括号,就表示创建这个元素指向实例对象的时候用的哪个构造方法。
  new Date(){};
 }
 
 public enum TrafficLamp{
  //{}元素是由TrafficLamp子类来实现的。
  //{}元素后面都是由TrafficLamp得子类匿名内部类来复写abstract方法。
  //(中传入值time,进行构造初始化)
  
  //现在的枚举元素就表示哪个构造方法,同时是哪个的子类
  //new子类的实例对象,并前调用有参的构造方法。
  RED(30){
   public  TrafficLamp nextLamp(){
    return GREEN;
   }
  },
  GREEN(45){
   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;}
 }

}

原创粉丝点击