1.为什么需要枚举?
在一些情况下,需要类实例化后是一些特定的对象,这个时候就需要一种特殊的类----->枚举,从而实现这种需求。
也就是说枚举是一种特殊的类,这个类中只包含一组有限的特定的对象。
2.枚举的两种实现方式
(1).自定义类实现枚举
a.实现思路
构造器私有化;
不对外提供set方法,防止属性被修改;
在类内部定义一些静态的常量,让外界可以通过类名来直接访问这些常量;
b.示例
public class MyEnum {
public static void main(String[] args) {
Season spring = Season.SPRING;
Season summer = Season.SUMMER;
Season autumn = Season.AUTUMN;
Season winter = Season.WINTER;
System.out.println(spring.toString());
System.out.println(summer.toString());
System.out.println(autumn.toString());
System.out.println(winter.toString());
}
}
class Season{
private String name;
private String des;
//定义静态常量
public final static Season SPRING = new Season("春天", "温暖");
public final static Season SUMMER = new Season("夏天", "热烈");
public final static Season AUTUMN = new Season("秋天", "凉爽");
public final static Season WINTER = new Season("冬天", "寒冷");
//构造器私有
private Season(String name, String des){
this.name = name;
this.des = des;
}
public String toString(){
return "Season{name: " + name + "\tdes: " + des + "}";
}
}
(2).使用enum关键字实现枚举
java提供定义枚举类的关键字是enum,enum的作用类似class,此时定义的这个枚举类里的常量需要放在最前面,以常量名(参数列表)的形式定义,如果有多个常量,之间使用,(逗号)间隔
示例:
public class EnumTest {
public static void main(String[] args) {
Season1 spring = Season1.SPRING;
Season1 summer = Season1.SUMMER;
Season1 autumn = Season1.AUTUMN;
Season1 winter = Season1.WINTER;
System.out.println(spring);
System.out.println(summer);
System.out.println(autumn);
System.out.println(winter);
}
}
enum Season1{
SPRING("春天", "温暖"), SUMMER("夏天", "热烈"),
AUTUMN("秋天", "凉爽"), WINTER("冬天", "寒冷");
private String name;
private String des;
Season1(String name, String des){
this.name = name;
this.des = des;
}
}
a.特点
- 构造器默认使用private修饰,public和protected不能修饰构造器
- 使用enum关键字定义枚举类时,会默认继承Enum类
- 定义常量需要放在最前面,并且使用的构造器必须存在
- 如果使用无参构造器定义常量,则参数列表和小括号都可以省略
示例,使用无参构造器定义常量:
enum Sex{
MAN, WOMAN;
}
b.enum常用方法
方法名 | 描述 |
---|---|
toString | 返回当前对象名,子类可以重写 |
name | 返回当前对象名,子类中不能重写 |
ordinal | 返回当前对象的位置号,按照枚举类中的定义顺序从0开始 |
values | 以数组形式返回当前枚举类中所有的常量,是一个静态方法 |
valueOf | 将字符串常量转换为枚举常量,要求字符串常量对应的枚举常量必须存在,否则抛异常,这是一个静态方法 |
compareTo | 比较两个枚举常量的位置号,返回位置号之差 |
c.enum使用细节
- enum在switch case中,直接使用枚举值,不需要使用类名.枚举值
示例:
enum Color{
RED(255, 0, 0),
BLUE(0, 0, 255),
BLACK(0, 0, 0),
YELLOW(255, 255, 0),
GREEN(0, 255, 0);
private final int redValue;
private final int greenValue;
private final int blueValue;
Color(int redValue, int greenValue, int blueValue) {
this.redValue = redValue;
this.greenValue = greenValue;
this.blueValue = blueValue;
}
public void show(){
System.out.println("red:" + redValue + ",green:" + greenValue + ",blue:" + blueValue);
}
}
public static void test() {
Color color = Color.BLACK;
color.show();
color = Color.YELLOW;
color.show();
switch (color) {
case BLACK:
System.out.println("黑色");
break;
case RED:
System.out.println("红色");
break;
case GREEN:
System.out.println("绿色");
break;
case BLUE:
System.out.println("蓝色");
break;
case YELLOW:
System.out.println("黄色");
break;
default:
break;
}
}