----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
枚举有什么作用:
让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。
那么以前的提现的形式是什么?
步骤:
1.私有默认构造函数,从而保证构造函数只能被内部使用。
2.每个元素使用公有静态成员表示
如:
publicclass Color {
private Color(){//...};
publicstaticfinal Color RED=new Color();
publicstaticfinal Color BLUE=new Color();
publicstaticfinal Color YELLOW=new Color();
publicstaticfinal Color GREEN=new Color();
}
枚举可以让编译器在编译时就可以控制源程序中填写的非法值,也就是说要是枚举有问题,那么在编译过程就不会通过。
通过enum关键字定义枚举类型,那么枚举有什么特点呢?
1.所有构造器必须私有化。
2. 其实每个枚举元素的成员其实就是定义的枚举类型的一个实例,并且它们都静态常量,因此枚举值最好全部大写。
3. 枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。
例如:枚举类
publicenum Color{
RED,
BLUE(),
YELLOW,
GREEN;
//上面的BLUE和BLUE()的效果是相同的都是调用默认的构造方
}
而对于枚举,就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
一、枚举提供的常用方法:
toString():可以直接获取枚举值的字符串描述
静态 values():可以让你取得所以枚举成员实例,并且以数组方式返回
静态 valueOf():可以让你将指定的字符串转换为对应枚举类型对象。
compareTo():可以比较两个枚举对象在枚举中的顺序,其中返回值:-1表示之前 0表示相同位置 1表示之后;这个方法的前提是这两个枚举值必须属于同一个枚举类,否则会报错。
ordinal():依枚举顺序得到对应的索引值,默认以0开始。
实例:
publicenum Color{
RED,BLUE,YELLOW,GREEN;
publicvoid getColorName(){
switch(this){
caseRED:
System.out.println("颜色是:red");
break;
caseBLUE:
System.out.println("颜色是:blue");
break;
caseYELLOW:
System.out.println("颜色是:yellow");
break;
caseGREEN:
System.out.println("颜色是:green");
break;
/*
//下面的报错,原因是不能加入不属于Color的枚举元素
case BLACK:
System.out.println("颜色是:BLACK");
break;
*/
}
}
publicstaticvoid main(String[] args){
Color red=Color.RED;
Color blue=Color.BLUE;
//可以直接获取枚举值的字符串描述
System.out.println(red.toString()); //RED
//可以让你取得所以枚举成员实例,并且以数组方式返回
System.out.println(Color.values()); //[LColor;@de6ced
//可以让你将指定的字符串转换为对应枚举类型对象。
System.out.println(Color.valueOf("BLUE")); //BLUE
//System.out.println(Color.valueOf("blue")); //这里报错,原因是必须是枚举元素的字符串
//可以比较两个枚举对象在枚举中的顺序,其中返回值:-1表示之前 0表示相同位置 1表示之后。
System.out.println(blue.compareTo(red)); //1
//依枚举顺序得到对应的索引值,默认以0开始。
System.out.println(blue.ordinal()); //1
}
}
二、带构造函数的枚举
注意:
1.构造器只是在构造枚举值的时候才被调用
2.所有构造器必须私有化,绝对不允许有public构造器,这是为了避免直接对枚举类型实例化。
publicenum Color{
RED,BLUE("小篮"),YELLOW,GREEN;
//使用public报错,只能使用private
private Color(){
System.out.println("打印>>"+this);
}
private Color(String name){
System.out.println(name+"打印>>"+this);
}
}
类加载的时候,打印结果:
打印>>RED
小篮打印>>BLUE
打印>>YELLOW
打印>>GREEN
三、抽象枚举类
注意:一个抽象枚举类,不需要在class前面加abstract抽象修饰
步骤:
1.定义的abstract方法,但是方法必须放在枚举元素的下面
2.在每个枚举元素成员中使用匿名内部类,进行abstract方法的实现。
publicenum Color{
//这里需要注意的是每个元素都要对抽象方法进行实现,不然编译报错
RED{
//对abstract方法实现
publicvoid printName(){
System.out.println("颜色是:red");
}
},
BLUE{
publicvoid printName(){
System.out.println("颜色是:blue");
}
},
YELLOW{
publicvoid printName(){
System.out.println("颜色是:yellow");
}
},
GREEN{
publicvoid printName(){
System.out.println("颜色是:green");
}
};
//抽象方法
publicabstractvoid printName();
}
那么根据上面,我们思考下,那么对应接口类呢,该怎么结合枚举处理?
步骤:
1、 定义的interface类
2、在枚举类里implements 接口类
3、在每个枚举元素成员中使用匿名内部类,实现接口提供的所有方法。
实例:
interface Masterplate{
publicvoid printName();
}
publicenum Color implements Masterplate{
RED{
publicvoid printName(){
System.out.println("颜色是:red");
}
},
BLUE{
publicvoid printName(){
System.out.println("颜色是:blue");
}
},
YELLOW{
publicvoid printName(){
System.out.println("颜色是:yellow");
}
},
GREEN{
publicvoid printName(){
System.out.println("颜色是:green");
}
};
}