枚举类

概念

实例有限且固定的类成为枚举类
java定义枚举类的关键字——enum;enum Enumtest{}这是一个和class interface 同类型的关键字。
它是一种特殊的类,可以拥有自己的成员变量、方法、和构造器。也可以实现接口,一个java源文件中只能有一个public修饰的enum类,而且文件名必须和此枚举类名相同。
与普通class类的区别:

  1. 继承自java.lang.Enum类,而非Object类,所以不能显式继承其他父类(单继承)。他的父类实现了java.lang.Serializable和java.lang.Comparable两个接口。
  2. 使用enum定义的非抽象枚举类会默认使用final修饰‘
  3. 构造器无论指定不指定都会强制使用private修饰,由于子类总要调用父类构造器一次,所以枚举类无法派生子类。
  4. 枚举类的所有实例必须在枚举类的第一行显示列出,否则永远不能产生实例,这些实例默认由public static final修饰

使用

枚举类名.values() 此方法返回枚举类的所有实例
借助

   for(var a :EnumClass.values())
	{
		System.out.println(s);
	}

使用枚举实例时:EnumClass.varibles

JDK1.5后 switch的控制表达式可以是任何枚举类型,case表达式中的值也可以是任何枚举值。

//s是枚举类实例 可以由EnumClass.varibles传入
swithch(s)
{
   case VARIABLE1:
   case VARIABLE2:
   case VARIABLE3:
}

枚举类的属性

Enum类的方法

int compareTo(E o) : 和同类型的枚举实例比较先后顺序(即同一个枚举类中的不同实例之间)
String name():返回此枚举实例的名称
int ordinal():返回枚举值在枚举类中的索引(从零开始
String toString():返回枚举常量的名称(常用)
public static <T extends Enum<T>> T valueOf(Class<T>enumType,String name):返回指定枚举类中指定名称的枚举值 传入String的枚举值 得到对应的枚举值

Enum的成员变量和方法
定义和普通类无异,但实例化对象以访问时需要通过valueOf或者EnumClass.的方式来创建对象而不是new;
Enum的实例变量有些不能随意定义,比如某一特定的枚举值必须对应某个实例变量的值,这是可以设置set方法通过switch(this)case来规范设置变量的值,避免不合理情况发生。更好的方法是将枚举类设置为不可变类。使用private final修饰成员变量,其默认值由枚举类显式定义构造器

	public enum EnumTest{
		MALE("男"),FEMALE("女");
		private final String name;
		private Gender(String name)
		{
			this.name = name;
		}
		public String getName()
		{
			return this.name;
		}
	}

	```
	//这样就起到了为不同枚举值定义各自的实例变量的作用。

枚举类实现接口:
可以实现一个或多个接口 ,与普通实现无异,但是为了不同枚举值调用时呈现不同的行为模式,

enum EnumTest implements InterFaceTest{
	//MALE,FEMALE;
	MALE("男"){
		public void info(){
		System.out.println("男性");
		}
	},FEMALE("女"){
		 public void info(){
  			System.out.println("女性");
		  }
 
	};
}

在枚举类中创建枚举值时,后面紧跟花括号在其中实现抽象方法,这种方法实际上不是创建枚举类的实例,而是创建EnumTest的匿名子类的实例;虽然说枚举类用final修饰,但是仅限于非抽象类,只要包含抽象方法的抽象枚举类系统默认用abstract修饰而不是final。
编译文件后生成EnumTest.class、EnumTest$1.class、EnumTest$2.class。证明MALE和FEMALE是EnumTest匿名子类的实例,而不是EnumTest类的实例。这是调用MALE和FEMALE时就会出现不同的行为方式。

抽象枚举类

在枚举类中建立抽象方法,通过上述方式枚举值进行各自的实现即可。
注意括号不是必要的,传参时使用即可,直接加花括号也可,定义抽象方法无异。编译时与实现接口一样有多个.class文件。
定义抽象方法时不能给枚举类加enum关键字,会自动添加,因为枚举类必须显示创建枚举值每个枚举值必须实现抽象方法,否则编译错误。
枚举类的main函数在这里插入图片描述
在这里插入图片描述

关于枚举类派生子类
枚举基类Enum详解
java enum(枚举)使用详解 + 总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值