----------- 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学习型技术博客、期待与您交流! ----------------------
详情请查看: