------- android培训、java培训、期待与您交流! ----------
黑马学习日志之二十 Java高新技术(二)
1枚举
问题:要定义星期几或性别的变量,该怎么定义?
假设用1-7分别表示星期一到星期日,(一般0表示星期日 6表示星期六)
但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。
枚举:枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
用普通类如何实现枚举功能:定义一个Weekday的类来模拟枚举功能。
1 私有的构造方法
2 每个元素分别用一个公有的静态成员变量表示
3 可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
public abstract class WeekDay1 {
private WeekDay1(){}
public final static WeekDay1 SUN = new WeekDay1(){
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return MON;
}
};
public final static WeekDay1 MON = new WeekDay1(){
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return SUN;
}
};
public abstract WeekDay1 nextDay();
/*public WeekDay nextDay(){
if(this == SUN){
return MON;
}else{
return SUN;
}
}
*/
public String toString(){
return this==SUN?"SUN":"MON";
}
}
2 枚举的基本应用
定义枚举使用的关键字是enum
方法
int name: 返回此枚举常量的名称,在其枚举声明中对其进行声明。
string ordinal:获取该元素的序号
static valueOf: 返回带指定名称的指定枚举类型的枚举常量。
static values:返回枚举中的所有元素的数组
定义一个名称为枚举类,那么该类就称为了一个枚举类,枚举类中的每个元素都是枚举对象,其中在枚举对象的后面加小括号,并书写其构造函数,就会调用该构造函数。
例子:
public static void main(String[] args) {
Weekday week = Weekday.MON;
String name = week.name();
System.out.println(name);
int num = week.ordinal();
System.out.println(num);
Weekday week1 = Weekday.valueOf("SUN");
System.out.println(week1);
Weekday[] arr = Weekday.values();
for (Weekday weekday : arr) {
System.out.println(weekday);
}
TrafficLamp color = TrafficLamp.RED;
System.out.println(color);
}
public enum Weekday{
SUN,MON,TUS,WNS,THUS,FRI,SAT;
private Weekday(){
System.out.println("first");
}
private Weekday(int day){
System.out.println("second");
}
}
3 带有构造方法的枚举
枚举的构造函数书写规则
(1)枚举的构造函数要写在每个对象元素的下方,并使用分号隔开
(2)枚举中的构造函数要使用private修饰,使之不能创建该枚举类的对象
(3)在枚举中调用对象,默认使用空参数的构造函数
(4)在枚举中可以定义含参数的构造函数,调用的方法是在对象元素后加小括号,并且传入参数,就实现了对含参数构造函数的调用。
(5)枚举元素MON和MON()的效果是一样的。
例子:
public enum WeekDay{
SUN(1),MON(),TUE,WED,THI,FRI,SAT;
private WeekDay(){System.out.println("first");}
private WeekDay(int day){System.out.println("second");}
}
4 实现带有抽象方法的枚举
定义枚举TrafficLamp
实现不同的next方法
实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。增加上表示时间的构造方法。
例子:
public enum TrafficLamp{
GREEN(45) {
public TrafficLamp next() {
return YELLOW;
}
},RED(60){
public TrafficLamp next(){
return GREEN;
}
},YELLOW(5){
public TrafficLamp next(){
return RED;
}
};
public abstract TrafficLamp next();
private int time;
private TrafficLamp(int time){
this.time = time;
}
}