枚举

 

枚举

一、枚举的作用介绍

1、为什么要有枚举
问题:要定义星期几或性别的变量,该怎么定义?
假设用1-7分别表示星期一到星期日,但有人可能会写成 int weekday = 0;
有的用0~6表示,当一个项目有很多人同时在开发时,为了同一,于是枚举就用上了,

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

2、用普通类如和实现枚举功能?
定义一个Weekday的类来模拟枚举功能。
1)私有的构造非法
2)每个元素分别用一个公有的静态成员变量表示
3)可以有若干公有方法或抽象方法,例如,要提供nextDay方法必须是抽象的。

3、用普通类模拟枚举的实现原理
定义一个Weekday的类来模拟枚举功能。
私有的构造方法,每个元素分别用一个公有的静态成员变量表示
可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将
大量的if.else语句转移成了一个个独立的类。

二、枚举的基本应用

枚举就相当于一个类,其中也可以定义构造方法,成员变量,普通方法和抽象方法。
枚举元素必须位于枚举体中的最开始部分,枚举元素列表的或面要有分号与其他成员分隔。
如果把枚举中的成员方法或变量等放在枚举元素的前面,编译器报错。

举例:定义一个Weekday的枚举。
扩展:枚举类的value,valueOf,name,toString,ordinal等方法。
总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,
例如可以调用
WeekDay.SUM.getClass().getName()和
WeekDay.class.getName()。

实例

class  Demo14{
    public static void main(String[] args) { 
        WeekDay weekDay2 =  WeekDay.FRI;
        System.out.println(weekDay2);
        System.out.println(weekDay2.name());
        System.out.println(weekDay2.ordinal());
        System.out.println(WeekDay.valueOf("SUN").toString());
        System.out.println(WeekDay.values().length);
    }
    public enum WeekDay{
        SUN,MON,TUE,WED,THI,FRI,SAT;  //这个分号可写可不写
    }
}
/*
结果
FRI
FRI
5
SUN
7
*/

三、实现带有构造方法的枚举

构造方法必须定义成私有的
如果有多个构造方法,该如何选择哪个构造方法?
枚举元素MON和MON()的效果一样,都是调用默认的构造方法。

实例

class Demo15 {
	public static void main(String[] args) {
		WeekDay today = WeekDay.SAT;
		System.out.println(today+"的下一天是"+today.nextDay());
	}
}
class WeekDay {
    //构造函数
	private WeekDay(){}

	//创建星期的七个对象
	public final static WeekDay SUN = new WeekDay();
	public final static WeekDay MON = new WeekDay();
	public final static WeekDay TUE = new WeekDay();
	public final static WeekDay WED = new WeekDay();
	public final static WeekDay THU = new WeekDay();
	public final static WeekDay FN  = new WeekDay();
	public final static WeekDay SAT = new WeekDay();
   
    //下一天的方法
	public WeekDay nextDay() {                               
		if(this==SUN)
            return MON;
        else if(this==MON) 
            return TUE;
        else if(this==TUE) 
            return WED;
        else if(this==WED) 
            return THU;
        else if(this==THU)
            return FN;
        else if(this==FN)
            return SAT;
        else 
            return SUN;
	}

    //重写toString()方法
	public String toString(){                             
		if (this == SUN) 
            return "星期日";
        else if(this==MON) 
            return "星期一";
        else if(this==TUE)
            return "星期二"; 
        else if(this==WED)
            return "星期三";
        else if(this==THU)
            return "星期四";
        else if(this==FN)
            return "星期五";
        else
            return "星期六";
	}
}

四、实现带有抽象方法的枚举

1、定义枚举TrafficLamp
2、实现普通的next方法
3、实现抽象的next方法:
    每个元素分别是由枚举类的子类来生产的实例对象,
    这些子类采用类似内部类的方式进行定义。
4、增加上表示时间的构造方法

如果枚举元素后面没有大括号对,那是不会生产内部类的。
先看有内部类的效果,再看没有内部类的效果,eclipse自动删除原来的内部类。
枚举只有一个成员时,就可以作为一种单例的实现方式。

实例

class Demo16{
	public static void main(String[] args){
		 WeekDay today = WeekDay.SAT;
		 System.out.println("SAT的下一天为"+today.nextDay());
	}

	//创建枚举
	public enum WeekDay {
		SUN {
			public WeekDay nextDay()
				return MON;
		},
		MON {
			public WeekDay nextDay()
				return TUE;
		},
		TUE {
			public WeekDay nextDay()
				return WED;
		},
		WED {
			public WeekDay nextDay()
				return THU;
		},
		THU {
			public WeekDay nextDay()
				return FN;
		},
		FN {
			public WeekDay nextDay()
				return SAT;
		},
		SAT {
			public WeekDay nextDay()
				return SUN;
		};

		public abstract WeekDay nextDay();//创建抽象方法nextDay(),返回的对象是类的本身WeekDay。
	}
}



 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值