枚举

来源:互联网 发布:linux 添加永久路由 编辑:程序博客网 时间:2024/05/22 12:13

1.为什么要有枚举?

问题:要定义星期几或性别的变量,该怎么定义呢?假设用1-7分别表示星期一到星期日,但有人可能

会写成int   weekday= 0;

枚举就是要让某个类型的变量的取值只能为若干个固定的值得一个,否则,编译器就会报错。

枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

2.用普通类如何实现枚举功能,定义weekday的类来模拟枚举功能。

1.私有的构造方法

2.每个元素分别用一个公有的静态成员变量表示

3.可以有若干公有方法或抽象方法,例如,要提供nextDay方法必须是抽象的。采用抽象方法定义nextDay就将大量的if.else语句转移成了

一个个独立的类。

如果想在一个类中写完各个枚举类和测试调用类,那么可以将枚举类定义成调用类的内部类。

(1) public class Weekday{

private WeekDay(){}

public final static  WeekDay SUN = new  WeekDay();

public final static  WeekDay  MON= new  WeekDay();

public WeekDay nexDay(){

if(this == SUN){

return MON;

}

else{

return  MON;

}

}

pubilc String toString(){

return this == SUN?"SUN":"SUN":"MON";

}

}

(2)public  abstract class WeekDay{

private  WeekDay(){

public final statci  WeekDay SUN  =new WeekDay(){

public  WeekDay nextDay(){

return MON;

}`

};

public final static WeekDay  MON = new Weekay(){

public  WeekDay nextDay(){

return  SUN;

}

};

3.枚举的基本应用

举例:定义一个weekday的枚举。

扩展:枚举类的values,valuesOf,name,toString,ordinal等方法

总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用

WeekDay.SUN.getClass().getName和WeekDay.clas.getName().



public class  emumeration{

public static void  main(String[]  args){

WeekDay1 weekDay = WeekDay1.MON;

System.out.println(weekDay.nextDay());


   WeekDay  weekDay2 = WeekDay.FRI;

System.out.println(weekDay2);

  System.out.println(weekDay.name());

System.out.println(weekDay.ordinal());

System.out.println(WeekDay.valueOf("SUN").toString());

System.out.println(WeekDay.values().length);

}

   public enum WeekDay{

SUN(1),MON(),TUE,WED,THI,FRI,SAT;

  private  WeekDay(){System.out.println("frist");

}

        private  WeekDay(int day){System.out.println("second")

}


}

枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。

枚举元素必须要位于枚举体中的最开始部分,枚举元素列表的后要有分好与其他成员分隔。

把枚举中的成员方法或变量等放在枚举元素的前面,,编译器报告错误。

4.带构造方法的枚举

1.构造方法必须定义私有的

2.如果有多个构造方法,该如何选择哪个构造方法?

3.枚举元素MON和MON()的效果一样,都是调用默认的构造方法。


带方法的枚举

1.定义枚举TrafficLamp

2.实现普通的next方法

3.实现抽象的next方法:每一元素分别是由枚举类的子类来生产的实例对象,这些子类采用类似内部类的

方式进行定义。

枚举只有一个成员时,就可以作为一种单例的实现方式。


下面是抽象枚举:

  public enumTrafficLamp{

RED(30)

  public  TrafficLamp  nextLamp(){

return  GREEN;

}

},

YELLOW(45){

public     TrafficLamp   nextLamp(){

return   YELLOW;

}

};  

public   abstract TrafficLamp  nextLamp(){

return  RED;

}

};

public  abstract  TrafficLamp    nextLamp();

private  int   time;

private   TrafficLamp(int time){this.time = time;}

}

}

稍复杂的枚举类型:

public enum Belle {

para1("this is para1"),

para2("this is para3"),

para3("this is para3"),

para4("this is para4");

 

public final String str; //定义枚举成员属性

 

Belle(String str) { //内部方法设定枚举成员属性

this.str = str;

}

}

 

这样就每一个枚举成员就有了属性,可以定义多个属性,每个属性必须在内部方法中set(例如this.str = str;)

调用时用这样的格式取值 belle.str

枚举成员就的属性可以不光是字符串,可以是任意对象

更复杂的枚举类型:

public enum Belle {

 

para1("this is para1") {

public String event() { //实现枚举成员的方法

return "i am  a mtthod of para1";

}

},

 

para2("this is para3") {

public String event() { //实现枚举成员的方法

return "i am  a mtthod of para2";

}

},

 

para3("this is para3") {

public String event() { //实现枚举成员的方法

return "i am  a mtthod of para3";

}

};

 

public final String str; //定义枚举成员属性

 

Belle(String str) { //内部方法设定枚举成员属性

this.str = str;

}

 

abstract String event();//定义枚举成员的方法

 

}

 

这样就每一个枚举成员就有了自己的方法,可以定义多个方法,方法必须以抽象方法的形式作声明(例如 abstract String event();) 一个方法一旦定义了就必须在每一个枚举成员中得到实现。

调用方法时用这样的格式 belle.event();







0 0
原创粉丝点击