java 5新增了一个enum关键字(它与class、interface关键字的地位相同),用以定义枚举类。枚举类是一种特殊的类,它一样可以有自己的Field、方法,可以实现一个或者多个接口,也可以定义自己的构造器。
枚举类与普通的类有如下区别:
1、枚举类可以实现一个或者多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是继承了Object类。其中Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口。
2、使用enum定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能被继承。
3、枚举类的构造器只能使用private访问控制符修饰,如果省略了访问控制符,则默认是private修饰,如果指定访问控制符只能是private
4、枚举类的所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无需程序员显示添加。
public enum SeasonEnum{
//在第一行列出4个枚举实例,用逗号隔开,最后一个用分号
SPRING,SUMMER,FALL,WINTER;
}
public class EnumTest{
public void jduge(SeasonEnum s){
//switch语句里表达式可以是枚举值
switch(s){
case SPRING:
System.out.println("春天");
break;
case SUMMER:
System.out.println("夏天");
break;
case FALL:
System.out.println("秋天");
break;
case WINNER:
System.out.println("冬天");
break;
}
}
public static void main(String[]args){
for(SeasonEnum s: SeasonEnum.values()){
System.out.println(s);
}
}
new EnumTest.judge(SeasonEnum.SPRING);
}
运行结果:
SPRING
SUMMER
FALL
WINTER
春暖花开,正好踏青
public enum Gender
{
//此处的枚举值必须调用对应构造器来创建
MALE("男"),FEMALE("女");
private String name;
//枚举类的构造器只能使用private修饰
private Gender(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
}
public class TestGender
{
public static void main(String[] args)
{
Gender g = Enum.valueOf(Gender.class , "FEMALE");
System.out.println(g + "代表:" + g.getName());
}
}
运行结果:
FEMALE代表:女
在枚举中列出枚举值时,实际上就是调用构造器创建枚举对象,只是这里无需使用new关键字,也无需显示调用构造器。前面列出的枚举值无需传入参数,甚至无需使用括号,仅仅是因为前面的枚举类包含无参的构造器。
上面的例子实际上等同于:
public static final Gender MAIL = new Gender("男");
public static final Gender FEMAIL = new Gender("女");
枚举实现接口的例子:
public interface GenderDesc
{
void info();
}
public enum Gender implements GenderDesc
{
//此处的枚举值必须调用对应构造器来创建
MALE("男")
{
public void info()
{
System.out.println("这个枚举值代表男性");
}
},
FEMALE("女")
{
public void info()
{
System.out.println("这个枚举值代表女性");
}
};
private String name;
//枚举类的构造器只能使用private修饰
private Gender(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
/*
public void info()
{
System.out.println("这是一个用于用于定义性别属性的枚举类");
}
*/
}
枚举定义抽象方法
public enum Operation2
{
PLUS
{
public double eval(double x , double y)
{
return x + y;
}
},
MINUS
{
public double eval(double x , double y)
{
return x - y;
}
},
TIMES
{
public double eval(double x , double y)
{
return x * y;
}
},
DIVIDE
{
public double eval(double x , double y)
{
return x / y;
}
};
//为枚举类定义一个抽象方法,这个抽象方法由不同枚举值提供不同的实现
public abstract double eval(double x, double y);
public static void main(String[] args)
{
System.out.println(Operation.PLUS.eval(3, 4));
System.out.println(Operation.MINUS.eval(5, 4));
System.out.println(Operation.TIMES.eval(5, 4));
System.out.println(Operation.DIVIDE.eval(5, 4));
}
}