枚举是java1.5新增加的特性
为什么要有枚举:如果你要定义星期几或者性别变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人会把星期天定义成int num=0 这样别人引用时可能会把星期天定义成7造成代码出错
先用一个普通类来模拟枚举类是如何实现的:
package com.enumclass;
/**
*
* 使用一个普通类模式怎么定义一个枚举类
*
*/
//如果定义了一个抽象类,就不能new对象 只能通过子类来new对象
public abstract class weekday {
//定义一个私有的构造方法
private weekday(){
}
//创建两个公有静态的对象
public final static weekday SUN=new weekday(){
@Override
public weekday nextDay() {
return MON;
}
};
public final static weekday MON =new weekday(){
@Override
public weekday nextDay() {
return SUN;
}
};
//采用抽象方法把一个个if else转移成了一个个类
public abstract weekday nextDay();
//创建一个方法返回当前类的下一天
/* public weekday nextDay(){
if(this==SUN){
return MON;
}
else{
return SUN;
}
}*/
//创建一个方法返回当前对象的值
public String toString(){
return this==SUN?"SUM":"MON";
}
public static void main(String[] args){
weekday week = weekday.SUN;
System.out.println(week.nextDay());
System.out.println(week.toString());
}
}
枚举的好处:枚举就是要让某个变量的取值只能是某几个固定的值,如果在编写程序时填写了非法的变量值,编译器就会报错,而普通的类无法实现这个功能。
怎么定义一个枚举:使用关键字enum
//使用关键字enum定义一个枚举类 下面代码是实现了怎么样定义一个枚举类
public enum Weekday2{
//每一个值都是一个weekday2类对象
SUN,MON,TUE,WED,THI,FRI,SAT;
}
枚举类有什么方法: String name() 返回该对象的名称
int ordinal() 返回自己在枚举类中的位置
静态方法:valueOf() 返回一个自己类型的对象
values() 返回一个枚举类型的数组
public static void main(String[] args){
//当想创建一个礼拜对象时,就只能取定义好的固定值,否则编译器就会报错
Weekday2 week2 =Weekday2.SUN;
System.out.println(week2); //这里输出为SUN 枚举类自动为我们实现了toString的方法
System.out.println(week2.name()); //这里的输出也为SUN 返回对象的名字
System.out.println(week2.ordinal()); //这里输出为0,返回的是你在枚举中的位置
System.out.println(Weekday2.valueOf("FRI").toString()); //把一个字符串类型的数据转换成Weekday2类型的数据
System.out.println(Weekday2.values().length); //这里输出为7 这个方法的作用是得到枚举类中有几个对象
}
实现带有构造方法的枚举:枚举类的构造方法必须是私有的,定义构造方法时要注意所有元素必须放在其他信息之前
public enum Weekday2{
/*
*如果这样写就会报错,因为元素必须放在所有成员元素之首
private Weekday2(){
}
*/
//每一个值都是一个weekday2类对象
SUN(1),MON(),TUE,WED,THI,FRI,SAT; //当想调用有参构造方法就在元素后面加个大口号里面传入构造方法所需要的参数
//这样就不会报错了
private Weekday2(){
System.out.println("first");
}
private Weekday2(int day){
System.out.println("second");
}
}
带有抽象方法的枚举类:
//再定义一个带抽象方法的交通灯枚举类 具有3个类对象 就是红灯,绿灯,黄灯
public enum TrafficlLamp{
//TrafficlLamp的子类去实现由红灯过后变为绿灯的方法
RED(30){ //代表红灯变为下一个时间的时间为30秒
public TrafficlLamp nextLamp(){
return GREEN;
}
},
//TrafficlLamp的子类去实现由绿灯过后变为黄灯的方法
GREEN(45){ //代表绿灯变为下一个时间的时间为45秒
public TrafficlLamp nextLamp(){
return YELLOW;
}
},
//TrafficlLamp的子类去实现由黄灯过后变为红灯的方法
YELLOW(5){ //代表黄灯变为下一个时间的时间为5秒
public TrafficlLamp nextLamp(){
return RED;
}
};
//这个抽象方法的实现的功能就是获取下个灯是什么颜色 由TrafficlLamp的子类去实现的
public abstract TrafficlLamp nextLamp();
private int time; //每个交通灯变为下一种颜色所需要的时间
//定义一个带参数的构造方法为new 对象时传递交通灯变颜色所需要的时间
private TrafficlLamp(int time){
this.time=time;
}
}
如果枚举只有一个成员时,就可以作为一种单例的实现方式
|