您的位置:首页 > 职场人生

黑马程序员:Java基础总结----枚举

2013-07-10 19:16 369 查看
黑马程序员:Java基础总结

枚举

ASP.Net+Android+IO开发.Net培训、期待与您交流!

枚举

为什么要有枚举

问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。

枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。

私有的构造方法

每个元素分别用一个公有的静态成员变量表示

可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。

枚举的基本应用

举例:定义一个Weekday的枚举。

扩展:枚举类的values,valueOf,name,toString,ordinal等方法(记住,讲课时要先于自定义方法前介绍,讲课更流畅)

总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。

普通方法实现枚举:
public class Ts
{
public static void main(String[]
args) {
[align=left] System. out.println(Weekday.mon);[/align]
[align=left] }[/align]
[align=left]}[/align]
abstract class Weekday
{
private Weekday()
{
[align=left] }[/align]

public final static Weekday mon = new Weekday()
{

[align=left] @Override[/align]
public Weekday
nextDay() {
// TODO Auto-generated
method stub
[align=left] return sun ;[/align]
[align=left] }[/align]

[align=left] @Override[/align]
publicString
toString() {
// TODO Auto-generated
method stub
[align=left] return "星期一" ;[/align]
[align=left] }[/align]

[align=left] };[/align]
public final static Weekday sun = new Weekday()
{

[align=left] @Override[/align]
public Weekday
nextDay() {
// TODO Auto-generated
method stub
[align=left] return mon ;[/align]
[align=left] }[/align]

[align=left] @Override[/align]
publicString
toString() {
// TODO Auto-generated
method stub
[align=left] return "星期三" ;[/align]
[align=left] }[/align]

[align=left] };[/align]

public abstract Weekday
nextDay();

[align=left] @Override[/align]
public abstractString
toString();

[align=left]}[/align]

[align=left]简单的枚举:[/align]
java.lang

类 Enum<E extends Enum<E>>


public class Ts
{
public static void main(String[]
args) {
[align=left] Weekday day = Weekday. Mon;[/align]

String
toString()


返回枚举常量的名称,它包含在声明中。
[align=left] System. out.println(day.toString());//Mon[/align]

String
name()


返回此枚举常量的名称,在其枚举声明中对其进行声明。
[align=left] System. out.println(day.name());//Mon[/align]

int
ordinal()


返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
[align=left] System. out.println(day.ordinal());//0[/align]

static

<T extends Enum<T>>

T
valueOf(Class<T> enumType,String name)


返回带指定名称的指定枚举类型的枚举常量。
[align=left] System. out.println(Weekday.valueOf( "Mon"));//Mon[/align]
[align=left]获取数组:[/align]
[align=left] System. out.println(Weekday.values(). length);//7[/align]

[align=left] }[/align]
[align=left]}[/align]
enum Weekday
{
[align=left] Mon, Tue , The, Wer, Fri, Sta , Sun;[/align]
[align=left]}[/align]

[align=left]枚举的高级应用[/align]

枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。

枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。

带构造方法的枚举

构造方法必须定义成私有的

如果有多个构造方法,该如何选择哪个构造方法?

枚举元素MON和MON()的效果一样,都是调用默认的构造方法。

带方法的枚举

定义枚举TrafficLamp

实现普通的next方法

实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。

增加上表示时间的构造方法

枚举只有一个成员时,就可以作为一种单例的实现方式。

public class Ts
{
public static void main(String[]
args) {
[align=left] TrafficLamp lamp = TrafficLamp. YRLLOW;[/align]
[align=left] System. out.println(lamp.nextLamp());//RED[/align]
[align=left] }[/align]

public enum TrafficLamp
{
[align=left] // 第一步RED{},GREEN{},YRLLOW{};[/align]
[align=left] // 第二步[/align]
RED(30)
{
[align=left] @Override[/align]
public TrafficLamp
nextLamp() {
// TODO Auto-generated
method stub
[align=left] return GREEN ;[/align]
[align=left] }[/align]

[align=left] },[/align]
GREEN(45)
{
[align=left] @Override[/align]
public TrafficLamp
nextLamp() {
// TODO Auto-generated
method stub
[align=left] return YRLLOW ;[/align]
[align=left] }[/align]

[align=left] },[/align]
YRLLOW(5)
{
[align=left] @Override[/align]
public TrafficLamp
nextLamp() {
// TODO Auto-generated
method stub
[align=left] return RED ;[/align]
[align=left] }[/align]

[align=left] };[/align]
[align=left] // 构造必须私有[/align]
private TrafficLamp()
{
[align=left] }[/align]

private TrafficLamp(int time)
{
[align=left] }[/align]

[align=left] // 抽象方法[/align]
public abstract TrafficLamp
nextLamp();
[align=left] }[/align]
[align=left]}[/align]

ASP.Net+Android+IO开发.Net培训、期待与您交流!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: