含有抽象方法的枚举类型:
public enum Operator
{
/*PLUS , MINUS , TIMES , DIVIDE;
double eval(double x , double y){
switch(this){
case PLUS: return x+y;
case MINUS:return x-y;
case TIMES:return x*y;
case DIVIDE:return x/y;
default:return 0;//java中如果省略则会编译不通过
}
}*/
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;
}
};
//为枚举类定义一个抽血方法,这个抽象方法由不同的
//枚举值提供不同的实现
/**
*两点说明:
*上面枚举值的后面的大括号实际上是一个 匿名类所以编译文件
*后你会看到5个.class文件,其中一个是Operator.class另外四个是匿名类的class文件]
*
*个人以为这种实现方式,只有在每一个枚举值拥有不同的操作时才比较合适
*否则推荐上一种实现方式
*/
public abstract double eval(double x, double y);
public static void main(String[] args)
{
Operator a = Enum.valueOf(Operator.class , "DIVIDE");
System.out.println(a.eval(3,2));
System.out.println(Operator.PLUS.eval(3,34));
System.out.println(Operator.MINUS.eval(345,2));
}
}
实现接口的枚举类
interface GenderDesc
{
void info();
}
enum Gender implements GenderDesc
{
//MALE("男"),FEMALE("女");
//上面两句等同于下面两句
/**
*public static final Gender MALE = new Gender("男");
*public static fianl Gender FEMALE = new Gender("女");
*/
//public String name;
//private Gender(String name){//必须是私有的构造器
// this.name = name;
//}
//s实现接口的方法,这样实现的接口与普通类几乎一样
//但是每个枚举值调用这个方法表现出一样的行为
/*public void info(){
System.out.println("这是一个用于定义性别属性的枚举类");
}
*/
//如果要想让不同的枚举值具有不同的行为方式可以改写成如下
//这种方式其实不是直接创建Gender枚举类的实例,而是相当
//于创建Gender的匿名子类的实例
//编译程序后会看到Gender$1.class 和 Gende$2.class
//这两个文件就是匿名子类的.class文件
//枚举值一定要在枚举类体的非注释代码开头列出来,否则会出现错误。(我用的是jdk1.7,经试验后得此结论)
MALE("男") {//花括号部分实际上是一个类体的部分,一个匿名类
public void info(){
System.out.println("这个枚举值代表男性");
}
} , //此处的逗号不能少,因为这里是列出枚举值
FEMALE("女") {
public void info(){
System.out.println("这个枚举值代表女性");
}
} ; //枚举结束,加分号!
public String name;
private Gender(String name){//必须是私有的构造器
this.name = name;
}
}
public class TestGender
{
public static void main(String[] args){
//通过enum的静态方法vallueof()方法获取指定枚举类型的枚举值
Gender g = Enum.valueOf(Gender.class , "FEMALE");
//g.name = "女";
//System.out.println(g + "代表" + g.name);
g.info();
}
}