java基础加强_03_枚举

枚举(enum):

枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调WeekDay.SUN.getClass().getName等。让某个类型的变量的取值只能为若干个因定值中的一个,枚举可以让编译器在编写代码时期就能判断其代码正确与否。

 

为什么要有枚举?

像有一些须要固定值来描述,且不让更改。如:定义的星期几或性别等。假用1-7 分别来表示星期一到星期日,但如果有人写成了 int weekday = 0; 以为是星期一那怎么办?所以须要枚举来限制weekday 只能取对应的几个固定值。

 

使用enum枚举类的特点:

1类默认继承了 java.lang.Enum 类

2,参数列表必须放在第一行。

3,参数列表是其类的子类。

4,底层已完成了对toString()方法的复写。

5,参数列表底层已完成了初始化。

6,属性的修饰关键字无须书写,底层已完成。

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

8,和普通 Java 类一样枚举类可以实现一个或多个接口。

9,若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式则可以让每个枚举值分别来实现该方法。

10,枚举类对象的属性不应允许被改动。

11JDK 1.5 中可以在 switch 表达式中使用枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字, 无需添加 

    枚举类作为限定

12如果枚举里只有一个成员时,同单例设计模式一样,可以作为一个单例来使用。

    用枚举来写单例的好处:构造方法不用写

举例说明:下例一

 

用普通类如何实现枚举功能?

1,私有的构造方法

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

3,可以有若干个公有方法或抽象方法,例如,要提供nextDay方法必须是抽象的。

举例说明:下例二

 

带有构造方法的枚举类:

在枚举中也可以定义构造方法,方法等。

如果定义了有参数构造方法,那么还可以通过其参数列表传值。

 

心得:如果我们须要固定某些调用值,就可以使用枚举,如:性别只让其调用男、女星期只让其调用周一至同日等。 把参数定义为一个可以当单例设计模式来使用。枚举类就是由内部类来完成。其参数列表就是其子类。如果想 让其参数列表(属性)完成不同的操作,可以使用抽象的方法。还可以避免大量的if...else语句

 

例一:

package enumtext2;
public class enumtext2 {
	public static void main(String[] args) {
		
		System.out.println("调用"+WeekDay.MON);
		
		//设定为枚举的某个值
		System.out.println(WeekDay.valueOf("TUE"));
		
		//获取枚举对象字节码
		Class sum = WeekDay.SUM.getDeclaringClass();
		
		//把枚举转换成数组
		WeekDay [] arrayweekday = WeekDay.values();
		System.out.println(arrayweekday.length);
		
		//红绿灯的切换
		System.out.println(TrafficLamp.RED+"--红灯停");
		System.out.println(TrafficLamp.RED.nextLamp()+"--绿灯走。。。");
		System.out.println(TrafficLamp.RED.nextLamp().nextLamp()+"--黄灯注											意!!!");
	}
	/*
	 * 枚举类自动调用java.lang.Enum包
	 * 
	 * 要求:实现一周7天的模拟,其调用范围只能是其参数列表中的一个固定值
	 * */
	public enum WeekDay  
	{
		/*
		 * 注意:
		 * 1,这里参数列表结束分号可有可无,但是如果后面还有语句的话,就必须要加上
		 * 2,这个参数列表表必须放在第一行。
		 * 3,参数后加(参数)如:SUM(3),表示的是调用有参构造器
		 * 4,这些参数列表都是WeekDay的子类
		 * 5,参数列表底层已完成了初始化
		 * 6,如果枚举里只有一个成员时,同单例设计模式一样,可以作为一个单例来使用
		 * 7,属性的修饰关键字无须书写,底层已完成。
		 * */
		SUM(3),MON(5),TUE,WED,THI,FRI,SAT;      
		
		private WeekDay() { System.out.println("初始化...first");}
		private WeekDay(int day) {System.out.println("初始化......second");}
	
		//枚举类底层已完成了对toString()方法的复写
	}
	/*
	 * 要求:实现交通灯的切换
	 * 		 用抽象的方法来完成
	 **/
	public enum TrafficLamp{
		
		//参数列表底层已完成了初始化,只须复写父类的抽象方法即可
		RED(30){  //停留30秒
			@Override 
			public TrafficLamp nextLamp() {  //完成抽象方法的复写				
				return GREEN;
			}			
		},
		GREEN(45){
			@Override
			public TrafficLamp nextLamp() {
				return YELLOW;
			}		
		},
		YELLOW(5){
			@Override
			public TrafficLamp nextLamp() {
				return RED;
			}
		};
		
		/*
		 * 用抽象方法来实现nextLamp()方法,可以避免大量的if...else语句
		 * 让其子类自己去完成相应的操作
		 * */
		public abstract TrafficLamp nextLamp();
		private int time;
		TrafficLamp(){}
		TrafficLamp(int time)  
		{
			this.time = time;
		}
	}
}

例二:

      用普通类来实现枚举功能

class EnumDemo
{
	public static void main(String[] args) 
	{
		//方法一
		Season s = Season.SPRING;
		System.out.println(s);
		System.out.println(s.nextSeason());//下一个季节
		
		//方法二
		Season2 s2 = Season2.SPRING;
		System.out.println(s2);
		System.out.println(s2.nextSeason());//下一个季节
	}
}

/*
用普通类来实现枚举功能

步骤:
	1,私有的构造方法
	2,每个元素分别用一个公有的静态成员变量表示
	3,可以有若干个公有方法或抽象方法。	

要求:
	模拟 春夏秋冬四个季节切换

方法一:用抽象方法,让其子类去实现切换
*/
public abstract class Season
{
	private Season(){}  //私有化构造器

	public final static Season SPRING = new Season(){
		public Season nextSeason()  //实现其父类抽象方法
		{
			return SUMMER;
		}
	};
	public final static Season SUMMER = new Season(){
		public Season nextSeason()  
		{
			return AUTUMN;
		}
	};
	public final static Season AUTUMN = new Season(){
		public Season nextSeason()  
		{
			return WINTER;
		}
	};
	public final static Season WINTER = new Season(){
		public Season nextSeason()  
		{
			return SPRING;
		}
	};
	
	public abstract Season nextSeason();

	public String toString()  //复写toString
	{
		if(this==SPRING) 
			return "SPRING";
		else if(this==SUMMER)
			return "SUMMER";
		else if(this==AUTUMN)
			return "AUTUMN";
		else 
			return "WINTER";
	}
}
//上面的类也可以改写成:如 Season2 枚举类

//方法二
public class Season2
{
	private Season2(){}

	public final static Season2 SPRING = new Season2();
	public final static Season2 SUMMER = new Season2();
	public final static Season2 AUTUMN = new Season2();
	public final static Season2 WINTER = new Season2();
	
	public Season2 nextSeason()
	{
		if(this==SPRING) 
			return SUMMER;
		else if(this==SUMMER)
			return AUTUMN;
		else if(this==AUTUMN)
			return WINTER;		
		else 
			return SPRING;
	}

	public String toString()
	{
		if(this==SPRING) 
			return "SPRING";
		else if(this==SUMMER)
			return "SUMMER";
		else if(this==AUTUMN)
			return "AUTUMN";
		else 
			return "WINTER";
	}
}

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值