关闭

黑马程序员 java基础加强——jdk1.5新特性—枚举

标签: java博客面向对象黑马程序员oop
372人阅读 评论(0) 收藏 举报
分类:

----------- android培训java培训java学习型技术博客、期待与您交流! ------------



jdk1.5新特性—枚举


一:枚举作用:枚举的作用就是要让某个类型的变量只能取若干固定值中的一个。否则,编译就会报错。枚举可以让编译器在编译时就控制程序的填写的值是否合法,

而普通变量没有办法达到这一步,所以枚举应运而生。

二:案例:

比如一个项目中表示星期,如果用普通变量,则可能有人用1—7表示星期一到星期日,但也有可能有人用0-6来表示,这样程序就会变得很麻烦,采用枚举就可以轻松的解决。

三:代码案例

a:用普通类来模拟枚举:定义一个Weekday来模拟枚举类的功能。

package cn.itcast.day1;

public abstract class WeekDay1 {
	private WeekDay1(){}
	
	public final static WeekDay1 SUN = new WeekDay1(){

		@Override
		public WeekDay1 nextDay() {
			// TODO Auto-generated method stub
			return MON;
		}
		
	};
	public final static WeekDay1 MON = new WeekDay1(){

		@Override
		public WeekDay1 nextDay() {
			// TODO Auto-generated method stub
			return SUN;
		}
		
	};	
	
	public abstract WeekDay1 nextDay();
	
/*	public WeekDay nextDay(){
		if(this == SUN){
			return  MON;
		}else{
			return SUN;
		}
	}
*/
	
	public String toString(){
		return this==SUN?"SUN":"MON";
	}
}

分析:1,因为数据元素为固定的,所以要把构造函数私有化,防止外部来new出 别的实例对象。

             2,为了方便外部的访问,把实例变量定义为共有的静态的成员变量

             3,可以有若干共有方法和抽象方法,例如本例中的nextDay就要定义为抽象的。需要不同的子类来实现。


四:枚举的基本应用

1,代码

package cn.itcast.day1;

public class EnumTest {

	public static void main(String[] args) {
		WeekDay1 weekDay = WeekDay1.MON;
		System.out.println(weekDay.nextDay());
		
		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(1),MON(),TUE,WED,THI,FRI,SAT;
		private WeekDay(){System.out.println("first");}
		private WeekDay(int day){System.out.println("second");}
	}
	
	public enum TrafficLamp{
		RED(30){
			public  TrafficLamp nextLamp(){
				return GREEN;
			}
		},
		GREEN(45){
			public  TrafficLamp nextLamp(){
				return YELLOW;
			}			
		},
		YELLOW(5){
			public  TrafficLamp nextLamp(){
				return RED;
			}			
		};
		public abstract TrafficLamp nextLamp();
		private int time;
		private TrafficLamp(int time){this.time = time;}
	}
}
运行结果:
SUN
second
first
first
first
first
first
first
FRI
FRI
5
SUN
7

 
分析:枚举封装了一些方法:

a:name()返回实例变量的名称,toStirng()方法返回的也是。

b:ordinal()方法返回实例成员的位置,第几个就返回几。

c:valueOf(String str)将参数里的String类型的字符串转变成同名的枚举类型的对象,这个很重要,比如在网页的应用中,用户提交的都是字符串,就需要我们把它转化为枚举,继而在经行处理。

d:values()返回封装了实例成员的数组,拿到数组后可以遍历每一个元素,进行操作。


五:带有构造方法和抽象方法的枚举

1,代码:

public enum TrafficLamp{
		RED(30){
			public  TrafficLamp nextLamp(){
				return GREEN;
			}
		},
		GREEN(45){
			public  TrafficLamp nextLamp(){
				return YELLOW;
			}			
		},
		YELLOW(5){
			public  TrafficLamp nextLamp(){
				return RED;
			}			
		};
		public abstract TrafficLamp nextLamp();
		private int time;
		private TrafficLamp(int time){this.time = time;}
	}

分析:

1,enum是枚举的关键字,类似于class

2,构造函数必须私有

3,实例后的括号代表实例在初始化的时候,调用哪个构造函数。缺省为调用空的构造函数。例如在Weekday中MON与MON()是一样效果的

3,每个元素是枚举子类生成的实例对象,这些对象都采用内部类的方式



           ---- ASP.Net+Android+IOS开发.Net培训、期待与您交流!--------详细请查看:http://edu.csdn.net------






0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7333次
    • 积分:206
    • 等级:
    • 排名:千里之外
    • 原创:14篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档
    最新评论