Java中的枚举

一、枚举的作用介绍(enum)

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

二、用普通类模拟枚举的实现原理

步骤:

(1) 私有的构造函数;

(2) 每个元素分别用一个共有的静态成员变量表示;

(3) 可以有若干方法或者抽象方法,将抽象方法转移成独立的类。

package cn.itcast;

public class Java_15 {
	public static void main(String[] args) {
		Weekday weekday = Weekday.THU;
	}
	
	public enum Weekday {
		SUN(), MON(1), TUE, WED, THU, FIR, SAT;
		/*在枚举后边跟上(),指向参数列表,就表示创建这个实例对象的时候指向对应构造方法*/
		private Weekday() {
			System.out.println("first");
		}
		private Weekday(int day) {
			System.out.println("second");
		}
	}
}

总结:

(1) 枚举实例化过程分析,当用到枚举类,里面的里面的静态变量都会初始化,此时调用对应的构造方法,如:MON(1),调用带参数的构造方法,即private Weekday(int day) {}。

SUN()与TUE调用无参的构造方法,即private Weekday() {}

(2) 如何保证唯一性,如:Weekdayweekday = Weekday.THU; THU这个常量是WeekDay类型的对象,所以可以把它赋给WeekDay引用类型的变量 weekDay,如果想为这个引用变量赋值,只能赋WeekDay类中规定好的。

三、枚举的基本应用                                                                                                                                                                                              

package cn.itcast;

public abstract class EnumTest1 {
	public static void main(String[] args) {	
		WeekDay weekday = WeekDay.FRI; //枚举就相当于一个类
		
		System.out.println(weekday.name());
		System.out.println(weekday.ordinal());//得到自己的排行
		System.out.println(WeekDay.valueOf("SUN"));//把字符转转换成枚举对象
		System.out.println(WeekDay.values().length);//将枚举中的对象转换成数组并求长度
	}
	//创建枚举
	public enum WeekDay {
		SUN, MON, TUE, WED, THU, FRI, SAT;
	}
}

四、实现带有参数的构造方法

只要用到了枚举类,里面的里面的静态变量都会初始化,此时调动构造方法;

在枚举后边跟上(),指向参数列表,就表示创建这个实例对象的时候指向对应构造方法

package cn.itcast;

public class Java_15 {

	public static void main(String[] args) {
		Weekday weekday = Weekday.THU;
	}
	
	public enum Weekday {
		SUN(), MON(1), TUE, WED, THU, FIR, SAT;
		/*在枚举后边跟上(),指向参数列表,就表示创建这个实例对象的时候指向对应构造方法*/
		private Weekday() {
			System.out.println("first");
		}
		private  Weekday(int day) {
			System.out.println("second");
		}
	}
}

综合实例:

实现带有抽象方法的枚举

内部类在成员位置上可以有四种修饰符

加上abstract之后RED只能是TrafficLamp子类的,就要实现其抽象方法。

package cn.itcast;

public class Java_16_02 {
	public static void main(String[] args) {
		TrafficLamp red = TrafficLamp.RED;
		red.nextLamp();
	}
}

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

分析:枚举TrafficLamp中定义了RED、GREEN、YELLOW,因为声明了抽象的方法nextLamp(),所以RED、GREEN、YELLOW只能由TrafficLamp的子类去实现,在RED(),内定义内部类实现nextLamp()方法。

你可能感兴趣的:(java,enum,枚举)