黑马程序员技术交流社区
标题:
关于枚举问题
[打印本页]
作者:
—__
时间:
2012-5-7 05:02
标题:
关于枚举问题
张孝祥 讲课方式 个人有点不习惯 枚举问题没听懂 ,请人简单给我在解释一下 另带几个实例应用 感激不仅
作者:
张小锋
时间:
2012-5-7 05:21
本帖最后由 张小锋 于 2012-5-7 05:28 编辑
枚举其实就是一种类型
就像int,String类...或者自定义的类, 比如Student,Person类.
枚举的定义和使用就像它们.(当你定义一个枚举类时,会生成对应的.class文件,这就是证明)
枚举同常用于语限制取值的范围;
例如定义一个星期类,因为固定是7天,只能限制值是0-6,使用枚举可以避免发生不必要的Exception,也可达到简化代码,明了的目的。
简单的示例:
性别:
public enum SexEnum {
male, female;
}
颜色:
public enum Color {
RED, BLUE,GREEN,BLACK;
}
作者:
赵玮_Tom
时间:
2012-5-7 06:43
本帖最后由 赵玮_Tom 于 2012-5-7 09:20 编辑
其实张老师讲的已经很清楚了。
枚举是jdk1.5的新特性。所谓枚举,就是你自定义的一种数据类型,这种类型只能在某个区间内取值(如交通灯的取值只能为红、绿、黄三种),超出取值区间,编译报错(如果不用枚举类型,错误有可能出现在运行时期)。
1)枚举用关键字enum来标记。
2)枚举的构造方法只能私有。
3)枚举的每个元素其实都是该枚举类的一个实例对象。
4)枚举元素类表要放在枚举类的最前面(构造方法、变量等都有放在枚举元素类表的后面)。
5)枚举可以有带参数的构造方法,如果枚举元素采用带参数的构造方法实例化,要调用该参数。
6)枚举可以有抽象方法,每个元素须覆写该方法。
7)单例模式也可以用只有一个元素的枚举来实现。
举例如下(其实也是张老师的例子WeekDay):
如果用一般的类来实现枚举功能,是这样的:
public abstract class WeekDay1
{
private WeekDay1(){};//私有构造方法
//在类内部创建多个子类实例对象,并覆写类中抽象方法(此处采用的是匿名内部类方式)
public static final WeekDay1 SUN = new WeekDay1()
{
public WeekDay1 nextDay()
{
return MON;
}
};
public static final WeekDay1 MON = new WeekDay1()
{
public WeekDay1 nextDay()
{
return TEU;
}
};
public static final WeekDay1 TEU = new WeekDay1()
{
public WeekDay1 nextDay()
{
return WED;
}
};
public static final WeekDay1 WED = new WeekDay1()
{
public WeekDay1 nextDay()
{
return THU;
}
};
public static final WeekDay1 THU = new WeekDay1()
{
public WeekDay1 nextDay()
{
return FRI;
}
};
public static final WeekDay1 FRI = new WeekDay1()
{
public WeekDay1 nextDay()
{
return SAT;
}
};
public static final WeekDay1 SAT = new WeekDay1()
{
public WeekDay1 nextDay()
{
return SUN;
}
};
public abstract WeekDay1 nextDay();
//toString方法
public String toString()
{
if(this==SUN)
return "SUN";
else if(this==MON)
return "MON";
else if(this==TEU)
return "TEU";
else if(this==WED)
return "WED";
else if(this==THU)
return "THU";
else if(this==FRI)
return "FRI";
else
return "SAT";
}
}
复制代码
实现统一的功能,枚举的实现方式是:
public enum WeekDay
{
//枚举中元素列表必须位于所有内容之前,并覆写抽象方法
SUN(0)
{
public WeekDay nextDay()
{
return MON;
}
},
MON(1)
{
public WeekDay nextDay()
{
return TEU;
}
},
TEU(2)
{
public WeekDay nextDay()
{
return WED;
}
},
WED(3)
{
public WeekDay nextDay()
{
return THU;
}
},
THU(4)
{
public WeekDay nextDay()
{
return FRI;
}
},
FRI(5)
{
public WeekDay nextDay()
{
return SAT;
}
},
SAT(6)
{
public WeekDay nextDay()
{
return SUN;
}
};
private int day;
//私有构造方法
private WeekDay(int day)
{
this.day = day;
};
//定义抽象方法
public abstract WeekDay nextDay();
}
复制代码
值得一提的是:API中提供了对枚举的支持,可以在API中查找到用于直接操作枚举的方法(如ordinal(), valueOf()等)。这样的话,采用枚举类比一般类的方式要更加简便,安全性更高。
作者:
隋营营
时间:
2012-5-7 07:35
用最简单的代码说明问题:
public class Testext {
public
enum
SCol {
Red, Green, Blue
};
public static void main(String[] args) {
System.out.println(SCol.
valueOf
(
"Red"
));
for (SCol color : SCol.
values
()) {
// values() 返回Scol类型数组
System.out.println(color); //输出:Red Green Blue
}
}
}
静态方法:valueOf() 和values() 在编译时产生,不会在源代码中出现。
也就是你在JDK文档的 java.lang.Enum<E> 类中找不到这两个方法!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2