Java枚举类

1.枚举类的基本知识

1.1枚举类的基本概念

枚举类是个特殊的类,关键字为enum,与class、interface关键字类似,但它也是一个特殊的类;

  • 枚举类可以继承多个接口,但是不能显式的继承其他父类;
  • 在enum定义的非抽象枚举类默认会使用final修饰,所以枚举类不能派生子类;
  • 构造器只能用private修饰,系统默认也为private;
  • 枚举类的所有实例必须在第一行显式列出,否则这个枚举类则无实例;
  • 枚举类可以有自己的成员变量和方法,可以定义自己的构造器;
  • 一个java源文件中,只能定义一个public访问权限的枚举类,且该源文件的名称也要与枚举类的类名相同。

1.2枚举类的示例代码

枚举类中的代码:

public enum SeasonEnum {
	// 在枚举类第一行显式创建四个枚举类
	Spring,Summer,Fall,Winter;
}

普通类中的代码:

public class UseEnum {
	// 使用switch语句引用枚举类的枚举值
	public void judge(SeasonEnum season) {
		switch(season) {
		case Spring:
			System.out.println("春季");
			break;
		case Summer:
			System.out.println("夏季");
			break;
		case Fall:
			System.out.println("秋季");
			break;
		case Winter:
			System.out.println("冬季");
			break;
		default:
			System.out.println("输入错误");
			break;
		}
	}
	public static void main(String[] args) {
		// 使用枚举类的values方法,访问枚举类的每个实例
		for(SeasonEnum season : SeasonEnum.values()) {
			System.out.println(season);
		}
		// 单独访问枚举类的实例
		new UseEnum().judge(SeasonEnum.Spring);
	}
}

运行结果为:
Spring
Summer
Fall
Winter
春季

2.枚举类的成员

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

我们可以利用枚举类的特性,在枚举类中设计出良好的封装效果,,而枚举类通常被设计为不可变类,所以一般枚举类中的,成员变量用private final修饰;所以我们应该在构造器中就给final修饰的变量赋初值;具体的实例解析,看下面的代码。

2.2枚举类的代码示例

枚举类中的代码:

public enum GenderEnum {
	// 这里的枚举值需要使用对应的构造器创建
	MALE("男"),FEMALE("女");
	// 使用private final修饰变量,形成封装
	// 外部类无法直接访问该变量
	private final String name;
	// 枚举类的构造器用private修饰
	private GenderEnum(String name) {
		this.name = name;
	}
	public String getName() {
		return this.name;
	}
}

普通类中的代码:

public class UseEnum {
	public static void main(String[] args) {
		// 创建对象
		GenderEnum gender = GenderEnum.valueOf("MALE");
		// 利用构造器,返回设定的值
		System.out.println("gender性别为:" + gender.getName());
	}
}

运行结果为:
gender性别为:男

3.枚举类实现接口

3.1枚举类对接口的实现

在枚举类中实现接口,一样需要实现其中的抽象方法;如果需要在不同的实例后,实现不同的方法,那么需要在实例后添加代码块,具体的代码格式看示例代码。

3.2示例代码

3.2.1在枚举类中所有实例共同实现接口

接口中的代码:

public interface GenderInter {
	void info();
}

枚举类中的代码:

public enum GenderEnum implements GenderInter{
	// 这里的枚举值需要使用对应的构造器创建
	MALE("男"),FEMALE("女");
	// 使用private final修饰变量,形成封装
	// 外部类无法直接访问该变量
	private final String name;
	// 枚举类的构造器用private修饰
	private GenderEnum(String name) {
		this.name = name;
	}
	public String getName() {
		return this.name;
	}
	
	// 在枚举类中实现接口中的方法
	@Override
	public void info() {
		// TODO Auto-generated method stub
		System.out.println("枚举类实现接口的方法");
	}
}

普通类中的代码:

public class UseEnum {
	public static void main(String[] args) {
		// 创建对象
		GenderEnum gender = GenderEnum.valueOf("MALE");
		// 利用构造器,返回设定的值
		System.out.println("gender性别为:" + gender.getName());
	}
}
3.2.2在枚举类中不同实例实现接口的不同方法

接口中的代码(同上):

public interface GenderInter {
	void info();
}

枚举类中的代码(有变):

public enum GenderEnum implements GenderInter{
	// 这里的枚举值需要使用对应的构造器创建
	MALE("男"){
		// 在实例后实现接口中的方法
		@Override
		public void info() {
			// TODO Auto-generated method stub
			System.out.println("代表男性的枚举值");
		}
	},FEMALE("女"){
		// 在实例后实现接口中的方法
		@Override
		public void info() {
			// TODO Auto-generated method stub
			System.out.println("代表女性的枚举值");
		}
	};
	// 使用private final修饰变量,形成封装
	// 外部类无法直接访问该变量
	private final String name;
	// 枚举类的构造器用private修饰
	private GenderEnum(String name) {
		this.name = name;
	}
	public String getName() {
		return this.name;
	}
}

普通类中的代码(同上):

public class UseEnum {
	public static void main(String[] args) {
		// 创建对象
		GenderEnum gender = GenderEnum.valueOf("MALE");
		// 利用构造器,返回设定的值
		System.out.println("gender性别为:" + gender.getName());
	}
}

在这样的情况时,编译后,枚举类会有GenderEnum.class、GenderEnum$1.class和GenderEnum$2三个文件,MALE与FEMALE都是枚举类匿名子类的实例。

4.枚举类中的抽象方法

一般而言,在枚举类中的抽象方法,每个枚举值需要去提供实现方法,对抽象方法进行重写。
实例代码如下:
枚举类中的代码:

public enum NumEnum {
	PLUS {
		// 实现抽象方法
		@Override
		public double eval(double x, double y) {
			// TODO Auto-generated method stub
			return x + y;
		}
	},MINUS {
		// 实现抽象方法
		@Override
		public double eval(double x, double y) {
			// TODO Auto-generated method stub
			return x - y;
		}
	},TIMES {
		// 实现抽象方法
		@Override
		public double eval(double x, double y) {
			// TODO Auto-generated method stub
			return x * y;
		}
	},DIVIDE {
		// 实现抽象方法
		@Override
		public double eval(double x, double y) {
			// TODO Auto-generated method stub
			return x / y;
		}
	};
	// 在枚举类中定义抽象类,供每个枚举值去实现
	public abstract double eval(double x,double y);
}

普通类中的代码:

public class UseEnum {
	public static void main(String[] args) {
		System.out.println(NumEnum.PLUS.eval(9, 3));
		System.out.println(NumEnum.MINUS.eval(9, 3));
		System.out.println(NumEnum.TIMES.eval(9, 3));
		System.out.println(NumEnum.DIVIDE.eval(9, 3));
	}
}

运行结果为:
12.0
6.0
27.0
3.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值