Java学习笔记一面向对象枚举类

使用enum关键字(和class、interface地位相同)定义枚举类。枚举类是一个特殊的类,它一样可以有自己的成员变量、方法,可以实现一个或多个接口,也可以定义自己的构造器。一个Java源文件中最多只能定义一个public访问权限的枚举类,且该源文件必须和该枚举类的类名相同。

  • 使用enum定义的枚举类默认继承java.lang.Enum类,而不是默认继承Object类,因此没距离不能显式继承其他父类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口。
  • 使用enum定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类。
    枚举类的构造器只能使用private访问符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private修饰符。
  • 枚举类的所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远都不能产生实例。列出的所有实例,系统会自动添加public static final修饰。枚举类默认提供values方法,可以遍历所有枚举值。
public enum SeasonEnum
{
	SPRING,SUMMER,FALL,WINTER;
}
public class EnumTest
{
	public void judge(SeasonEnum s)
	{
		switch (s)
		{ //当switch控制表达式使用枚举类型时,后面case表达式中的值直接使用枚举值的名字,无须添加限定
			case SPRING:
				System.out.println("春");
				break;
			case SUMMER:
				System.out.println("夏");
				break;
			case FALL:
				System.out.println("秋");
				break;
			case WINTER:
				System.out.println("冬");
				break;
		}
	}
	public static void main(String[] args)
	{
		for(SeasonEnum s; SeasonEnum.values())
			System.out.println(s);
		new EnumTest().judge(SeasonEnum.WINTER);
	}
}

枚举类型的成员变量、方法和构造器

一旦为枚举类型定义了带参数的构造器,列出枚举值时就必须对应传入参数。在枚举类中列出枚举值时,实际上就是调用构造器创建枚举类对象,只是这里无须使用new,也无须显式调用构造器。

public enum Gender
{
	//此处的枚举值必须调用对应的构造器来创建
	MALE("男"),FEMALE("女");
	private final String name;
	//枚举类的构造器只能使用private修饰
	private Gender(String name) { this.name = name; }
	public String getName() { return this.name; }
}

实现接口的枚举类

public interface GenderDesc { void info(); }
public enum Gender implements GenderDesc
{
	//此处的枚举值必须调用对应的构造器来创建
	MALE("男"),FEMALE("女");
	private final String name;
	//枚举类的构造器只能使用private修饰
	private Gender(String name) { this.name = name; }
	public String getName() { return this.name; }
	//增加info方法,实现接口必须实现的方法
	public void fnfo()
	{
		System.out.println("这是性别枚举类");
	}
}

如果由枚举类来实现接口里的方法,则每个枚举值在调用该方法时都由=有相同的行为。如果需要不同枚举值调用方法呈现不同行为,则需要针对枚举值提供不同的实现。

MALE("男")
{ // 类体
	public void info() {System.out.println("这是性别枚举类:男");}
},
MALE("女")
{ // 类体
	public void info() {System.out.println("这是性别枚举类:女");}
}

当创建MALE\FEMALE枚举值时,并不是直接创建Gender枚举类的实例,而是相当于创建Gender的匿名子类的实例。这部分代码和匿名内部类语法大致形似,它是枚举类的匿名内部子类。

包含抽象方法的枚举类

枚举类里定义抽象方法时不能使用abstract关键字将枚举类定义成抽象类(因为系统自动为它添加abstract关键字),但因为枚举类需要显式创建枚举值,而不是作为父类,所以定义每个枚举值时必须为抽象方法提供实现,否则编译出错。

public enum Operation
{
	PLUS
	{
		public double eval(double x, double y) { return x + y; }
	},
	MINUS
	{
		public double eval(double x, double y) { return x - y; }
	},
	TIMES
	{
		public double eval(double x, double y) { return x * y; }
	},
	DIVIDE
	{
		public double eval(double x, double y) { return x / y; }
	};
	// 为枚举类定义一个抽象方法,由不同枚举值提供不同的实现
	public abstract double eval(double x, double y);
	public static void main(String[] args)
	{
		System.out.println(Operation.PLUS.eval(5,4));
		System.out.println(Operation.MINUS.eval(5,4));
		System.out.println(Operation.TIMES.eval(5,4));
		System.out.println(Operation.DIVIDE.eval(5,4));
	}
}
发布了134 篇原创文章 · 获赞 141 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/asmartkiller/article/details/104925484